总时间限制:
-
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