洛谷 P3392 涂国旗

 P3392 涂国旗

题目描述

某国法律规定,只要一个由N*M个小方块组成的旗帜符合如下规则,就是合法的国旗。(毛熊:阿嚏——)

  • 从最上方若干行(>=1)的格子全部是白色的。

  • 接下来若干行(>=1)的格子全部是蓝色的

  • 剩下的行(>=1)全部是红色的

现有一个棋盘状的破布,分成了N行M列的格子,每个格子是白色蓝色红色之一,小a希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色。

小a很懒,希望涂最少的格子,使这块破布成为一个合法的国旗。

输入输出格式

输入格式:

 

第一行是两个整数,N,M

接下来N行是一个矩阵,矩阵的每一个小方块是'W'(白),'B'(蓝),'R'(红)中的一个

 

输出格式:

 

一个整数,表示至少需要涂多少块。

 

输入输出样例

输入样例#1:
4 5
WRWRW
BWRWB
WRWRW
RWBWR
输出样例#1:
11

说明

样例解释:

目标状态是

WWWWW
BBBBB
RRRRR
RRRRR

一共需要改11个格子

对于100%的数据,N,M<=50

 

/*纯暴力枚举 O(n^4) 一层一层搜 依次更新ans找到最小值*/
#include<cstdio>
int n,m,ans=1e9;
char a[52][52];
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=0;i<n;i++)
    scanf("%s",a[i]);
    for (int i=0;i<n-2;i++)
           for (int j=i+1;j<n-1;j++)
           {
            int tot=0;
            for (int x=0;x<=i;x++)
                for (int y=0;y<m;y++)
                    if (a[x][y]!='W')
                        tot++;    //染白需几步 
            for (int x=i+1;x<=j;x++)
                for (int y=0;y<m;y++)
                    if (a[x][y]!='B')
                        tot++;    //染蓝需几步 
            for (int x=j+1;x<n;x++)
                for (int y=0;y<m;y++)
                    if (a[x][y]!='R')
                        tot++;    //染红需几步 
            if (tot<ans)
                ans=tot;
        }
    printf("%d",ans);
    return 0;
}

 

posted @ 2016-09-25 10:41  球痞丶小七  阅读(303)  评论(0编辑  收藏  举报