第一周 枚举:1.画家问题

总时间限制:
1000ms
内存限制:
65536kB
描述
有一个正方形的墙,由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"。
样例输入
2 
3 
yyy 
yyy 
yyy 
5
wwwww 
wwwww 
wwwww 
wwwww 
wwwww 
样例输出
0 
15 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 using namespace std;
 5  
 6 int t = 0;
 7 int n = 0;
 8 char col[20];
 9 bool c[20][20] = {0};
10 bool colored[20][20] = {0};
11 bool swit[20][20] = {0};
12  
13 void changeswit(int a, int b)
14 {
15     colored[a][b] = !colored[a][b];
16     colored[a - 1][b] = !colored[a - 1][b];
17     colored[a + 1][b] = !colored[a + 1][b];
18     colored[a][b - 1] = !colored[a][b - 1];
19     colored[a][b + 1] = !colored[a][b + 1];
20 }
21  
22  
23 int main()
24 {
25     scanf("%d", &t);
26     for(int ti = 1; ti <= t; ++ti)
27     {
28         int sum = 0;
29         scanf("%d", &n);
30         int min = n * n + 1;
31         for(int i = 1; i <= n; ++i)
32         {
33             scanf("%s", col);
34             for(int j = 1; j <= n; ++j)
35             {
36                 if(col[j - 1] == 'y') c[i][j] = 1;
37                 else c[i][j] = 0;
38             }
39         }
40         for(int k = 0; k < pow(2.0, n); k++)
41         {
42             for(int i = 1; i <= n; i++)
43                 for(int j = 1; j <= n; j++)
44                 {
45                     colored[i][j] = c[i][j];
46                 }
47             for(int i = 1; i <= n; i++)
48             {
49                 swit[1][i] = (k>>(i - 1)) & 1;
50                 if(swit[1][i])
51                 {
52                     changeswit(1, i);
53                     sum++;
54                 }
55             }
56             for(int i = 2; i <= n; i++)
57                 for(int j = 1; j <= n; j++)
58                     if(!colored[i - 1][j])
59                     {
60                         swit[i][j] = 1;
61                         sum++;
62                         changeswit(i, j);
63                     }
64             int mark = 0;
65             for(int j = 1; j <= n; j++)
66                 if(!colored[n][j]) mark = 1;
67             if(!mark && sum < min) min = sum;
68             sum = 0;
69         }
70         if(min != n*n + 1) printf("%d\n",min);
71         else printf("inf\n");
72     }
73     return 0;
74 }         
原文地址:https://www.cnblogs.com/Konayuki2015/p/4514210.html