- 总时间限制:
- 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 }
时间: 2024-10-30 02:30:06