目录
题目描述:
输入输出格式:
输入输出样例:
源代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string flag[50];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; ++i)
cin >> flag[i];//每个字符串代表一行,下标代表不同列
int numw, numb, numr;//分别代表白,蓝,红的行数
int ans = 9999;//存放答案
for (numw = 1; numw <= n - 2; ++numw)
for (numb = 1; numb<=n-1-numw;++numb)
for (numr = 1; numr <= n - numw - numb; ++numr)
{
if (numw + numb + numr == n)//如果符合行数条件
{
int times = 0;//记录要改变的格子数量
for (int i = 0; i < numw; ++i)//检查该涂白色的地方
{
for (auto c : flag[i])//遍历当行字符串
{
if (c != 'W')
++times;//改变格子数量+1
}
}
for (int j = numw; j < numw + numb; ++j)
{
for (auto c : flag[j])
{
if (c != 'B')
++times;
}
}
for (int r = numw + numb; r < n; ++r)
{
for (auto c : flag[r])
{
if (c != 'R')
++times;
}
}
ans = min(ans, times);//打擂台法寻找最小的次数答案
}
}
cout << ans << endl;
}
分析思路:
1.非常经典的一道暴力枚举的题目,这题我们使用string数组来存放题目所给的字符矩阵,这样的好处是我们可以使用C++的范围for语句方便的遍历每行字符串,并且通过下标访问每一行。
2.枚举三种颜色行的数量,为了不超时,可以剪枝枚举,内层循环的上界根据相对外层循环的值进行调整。
3.对每种颜色行进行检查,因为题目只是问答案的最小次数,所以不必真的去改变字符数组内元素内容(实际上,如果真的这么做反而会造成错误,后面的情况无法统计到正确的times)。