栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

暴力枚举 洛谷3392 涂国旗

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

暴力枚举 洛谷3392 涂国旗

目录

题目描述:

输入输出格式:

​ 

 输入输出样例:

源代码:

分析思路:


 

题目描述:

输入输出格式:

 

 输入输出样例:

源代码:
#include
#include
#include
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)。

   

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312261.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号