涂国旗
题目描述
某国法律规定,只要一个由 N × M N \times M N×M 个小方块组成的旗帜符合如下规则,就是合法的国旗。(毛熊:阿嚏——)
- 从最上方若干行(至少一行)的格子全部是白色的;
- 接下来若干行(至少一行)的格子全部是蓝色的;
- 剩下的行(至少一行)全部是红色的;
现有一个棋盘状的布,分成了 N N N 行 M M M 列的格子,每个格子是白色蓝色红色之一,小 a 希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色。
小a很懒,希望涂最少的格子,使这块布成为一个合法的国旗。
输入格式
第一行是两个整数 N , M N,M N,M。
接下来
N
N
N 行是一个矩阵,矩阵的每一个小方块是W
(白),B
(蓝),R
(红)中的一个。
输出格式
一个整数,表示至少需要涂多少块。
样例 #1
样例输入 #1
4 5
WRWRW
BWRWB
WRWRW
RWBWR
样例输出 #1
11
提示
样例解释
目标状态是:
WWWWW
BBBBB
RRRRR
RRRRR
一共需要改 11 11 11 个格子。
数据范围
对于 100 % 100\% 100% 的数据, N , M ≤ 50 N,M \leq 50 N,M≤50。
解题思路:
对于这道题,我们可以依次枚举涂白色和蓝色的行数,在确定好白色和蓝色的行数后,剩下的就是红色的行数,因此,外层就是一个两层循环,然后在内层就是分别计算出涂白格子,蓝格子,红格子所需要的个数,然后取最小值即可。
代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m,sum=10000000;
cin>>n>>m;
char board[n+1][m+1];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>board[i][j];
for(int i=1;i<=n-2;i++)
{
for(int j=i+1;j<=n-1;j++)
{
int cntW=0,cntB=0,cntR=0;
int W=1,B=1,R=1;
for(W=1;W<=i;W++)
{
for(int p=1;p<=m;p++)
{
if(board[W][p]!='W') cntW++;
}
}
for(B=W;B<=j;B++)
{
for(int p=1;p<=m;p++)
{
if(board[B][p]!='B') cntB++;
}
}
for(R=B;R<=n;R++)
{
for(int p=1;p<=m;p++)
{
if(board[R][p]!='R') cntR++;
}
}
sum=min(sum,cntW+cntB+cntR);
}
}
cout<<sum;
return 0;
}