[POJ1681]画家问题

来源:互联网 发布:流星网络电视tv版apk 编辑:程序博客网 时间:2024/05/01 06:00

描述

有一个正方形的墙,由N*N个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i, j)个位置的砖时, 位置(i-1, j)、 (i+1, j)、 (i, j-1)、 (i, j+1)上的砖都会改变颜色。请你帮助Bob计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。

输入

第一行是个整数t(1≤t ≤20),表示要测试的案例数。然后是t个案例。每个案例的首行是一个整数n (1≤n ≤15),表示墙的大小。接下来的n行表示墙的初始状态。每一行包含n个字符。第i行的第j个字符表示位于位置(i,j)上的砖的颜色。“w”表示白砖,“y”表示黄砖。

输出

每个案例输出一行。如果Bob能够将所有的砖都涂成黄色,则输出最少需要涂画的砖数,否则输出“inf”。


思路:每个点最多只可能涂1次,因为涂2次和没涂一样。第一行通过枚举随机涂几个点,第二行开始判断他上边的点是否为黄色,不是则涂他自己,一直到最后一行。全部涂完后判断最后一行的点是否均为黄色,是的话则有解,不是则无解。代码如下:

#include <iostream>#include <cstdio>#include <cmath> int map[20][20];int copy[20][20];int line[20];char col[20];int n;int min;int count; void draw(int x, int y){    //绘制并增加绘制次数     map[x][y] = !map[x][y];    map[x-1][y] = !map[x-1][y];    map[x+1][y] = !map[x+1][y];    map[x][y-1] = !map[x][y-1];    map[x][y+1] = !map[x][y+1];    count++;} bool guess(){    //从第二行开始 判断每个点上边的点是否为黄色 如果不是黄色 则涂该点     for(int i=2; i<=n; i++)        for(int j=1; j<=n; j++)            if(map[i-1][j] == 0)                draw(i,j);      //判断最后一行是否都为黄色 如果是则记录次数 否则提交失败     for(int k=1; k<=n; k++)        if(map[n][k] != 1)            return false;    if(count < min)        min = count;    return true;} void getLine(int k){    //通过二进制枚举第一行可能发生的所有情况     int j = n;    while(j>0){        line[j] = k % 2;        k /= 2;        j--;    }} int main(){    int w;    scanf("%d\n", &w);    while(w--){        scanf("%d\n", &n);        min = n * n + 1;        for(int i=1; i<=n; i++){            scanf("%s", col);            for(int j=1; j<=n; j++)                if(col[j-1] == 'w')                    copy[i][j] = 0;                else                    copy[i][j] = 1;        }        for(int k=0; k<pow(2.0, n); k++){            count = 0;            memcpy(map, copy, sizeof(copy));            getLine(k);            for(int i=1; i<=n; i++)                if(line[i] == 1)                    draw(1,i);             guess();        }         if(min != n * n + 1)            printf("%d\n",min);        else            printf("inf\n");    }    return 0;}


1 0
原创粉丝点击