P3392 洛谷暴力 涂国旗
题目描述
某国法律规定,只要一个由 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。
Code:
#include <stdio.h>
#include <stdlib.h>
int main(){
int n, m;
scanf("%d %d", &n, &m);
int w, b, r, a1[55]={0}, a2[55]={0}, a3[55]={0}; //a1装每一行w颜色国旗的个数
int sum, ans=999999; //sum 枚举情况涂小方格的总和 ans 最优解
char temp; //存储读入的国旗颜色
char buf[55];
int i,j;
for(i=1; i<=n; i++){
scanf("%s", buf);
for(j=0; j<m; j++){
temp=buf[j];
if(temp == 'W') a1[i]++;
if(temp == 'B') a2[i]++;
if(temp == 'R') a3[i]++;
}
}
for(w=1; w<=n-2; w++){
for(b=1; b<=n-w-1; b++){ //枚举每一行需要涂的格子数
sum=0;
for(i=1; i<=w; i++) sum+=m-a1[i];
for(i=w+1; i<=w+b; i++) sum+=m-a2[i];
for(i=w+b+1; i<=n; i++) sum+=m-a3[i];
if(sum < ans) ans=sum;
}
}
printf("%d", ans);
return 0;
}