洛谷 涂国旗 请问我的代码还需要完善什么

代码过不了oj,有四个数据错误
某国法律规定,只要一个由N×M 个小方块组成的旗帜符合如下规则,就是合法的国旗:

(1)从最上方若干行(至少一行)的格子全部是白色的;

(2)接下来若干行(至少一行)的格子全部是蓝色的;

(3)剩下的行(至少一行)全部是红色的;

现有一个棋盘状的布,分成了N行M列的格子,每个格子是白色蓝色红色之一,小民希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色。小民很懒,希望涂最少的格子,使这块布成为一个合法的国旗。

【输入形式】

第一行是两个整数 N,M。

接下来是 N×M一个矩阵,矩阵的每一个小方块是W(白),B(蓝),R(红)中的一个。

【输出形式】

一个整数,表示至少需要涂多少块。

【样例输入】

4 5

WRWRW

BWRWB

WRWRW

RWBWR

【样例输出】

11

【数据范围】

对于100% 的数据,N,M≤50。

#include<bits/stdc++.h>
using namespace std;
int n,m;int i,j;
int W[100],B[100],R[100];
string str[100];
int main()
{
cin >> n >> m;
for(i = 1;i<=n;i++)
{
cin >> str[i];
for(j = 1;j<=m;j++)
{
if(str[i][j] != 'R')
R[i]++;
if(str[i][j] != 'W')
W[i]++;
if(str[i][j] != 'B')
B[i]++;

    }
    
}
    W[i]=W[i-1];
    B[i]=B[i-1];
    R[i]=R[i-1];
    int count = 0;
    for(i = 1;i <= n-2;i++)
    {
        for(j = i+1;j <=n-2;j++)
        {
            count =R[i]+W[i]+B[i];
        }
    }
    cout << count;
    return 0;

}
//设第 1 行到第 i 行是白色

//第 i + 1 行到第 j 行是蓝色

//则第 j + 1行到第 n 行是红色

你下面写的注释写的逻辑是对的,但是代码的逻辑是错误的。
先贴运行结果:

img


解题思路:
题目首先需要保证第1行是白色、最后一行是红色,然后假设在s行变成蓝色,在t行开始变成红色,然后双重for循环遍历,计算最小值就可以了。
代码修改如下:

#include<bits/stdc++.h>
//#include <iostream>
using namespace std;
int n, m; int i, j;
string str[50];
int main()
{
    cin >> n >> m;
    for (i = 0; i < n; i++)
    {
        cin >> str[i];
    }
    
    int count = 0;
    
    for (j = 0; j < m; j++)
    {
        //保证第一行必须全部是白色
        if (str[0][j] != 'W')
            count++;
        //保证最后一行必须全部是红色
        if (str[n - 1][j] != 'R')
            count++;
    }
    //查找中间的怎么处理是修改次数最少的情况
    int tmp=0, min = -1;
    //假设在第s行开始变成蓝色,在第t行变成红色
    int s = 1, t = 1;
    for (s = 1; s < n - 1; s++)
    {
        for (t = s + 1; t < n - 1; t++)
        {
            tmp = 0;
            //计算从1到s-1行需要改变的颜色,从其它颜色改变为白色
            for (int x = 1; x < s; x++)
            {
                for (int y = 0; y < m; y++)
                {
                    if (str[x][y] != 'W')
                        tmp++;
                }
            }
            //计算从s到t-1行需要改变的颜色,从其它颜色改变为蓝色
            for (int x = s; x < t; x++)
            {
                for (int y = 0; y < m; y++)
                {
                    if (str[x][y] != 'B')
                        tmp++;
                }
            }

            //计算从t行到n-1行需要改变的颜色,从其它颜色改变为红色
            for (int x = t; x < n - 1; x++)
            {
                for (int y = 0; y < m; y++)
                {
                    if (str[x][y] != 'R')
                        tmp++;
                }
            }
            //比较得到最小值
            if (min == -1)
                min = tmp;
            else if (tmp < min)
                min = tmp;
        }
    }
    
    cout << count+min;
    return 0;
}

看不出来你的解题思路是啥。12行只是进行count的计算,啥比较也没有,那count不就是最后一次循环的结果么?????

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632