代码过不了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 行是红色
你下面写的注释写的逻辑是对的,但是代码的逻辑是错误的。
先贴运行结果:
#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不就是最后一次循环的结果么?????
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!