OpenJudge 2813 画家问题 / Poj 1681 Painter's Problem

1.链接地址:

http://bailian.openjudge.cn/practice/2813

http://poj.org/problem?id=1681

2.题目:

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

3.思路:

此题思路与 OpenJudge 2811 熄灯问题 和 Poj 1222 EXTENDED LIGHTS OUT 一样,请查看以下

http://www.cnblogs.com/mobileliker/p/3548190.html

注意此题的区别是有可能出现不存在的情况,所以要多一个判断

4.代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <string>
 5 #include <cstring>
 6 
 7 using namespace std;
 8 
 9 int main()
10 {
11     int i,j;
12 
13     int t;
14     cin>>t;
15 
16     int n;
17     int flag;
18     while(t--)
19     {
20         flag = 1;
21         cin>>n;
22 
23         bool *arr_draw = new bool[(n + 2) * (n + 2)];
24         bool *arr_draw_save = new bool[(n + 2) * (n + 2)];
25         bool *arr_res = new bool[(n + 2) * (n + 2)];
26 
27         string str;
28         memset(arr_draw,0,sizeof(bool) * (n + 2) * (n + 2));
29         for(i = 1; i <= n; ++i)
30         {
31             cin>>str;
32             for(j = 1; j <= n; ++j)
33             {
34                 if(str[j-1] == 'y') arr_draw[i * (n + 2) + j] = false;
35                 else arr_draw[i * (n + 2) + j] = true;
36             }
37         }
38         memcpy(arr_draw_save,arr_draw,sizeof(bool) * (n + 2) * (n + 2)); 
39 
40         memset(arr_res + 1 * (n + 2),0,sizeof(bool) * (n + 2));
41         while(1)
42         {
43             for(i = 1; i <= n; ++i)
44             {
45                 for(j = 1; j <= n; ++j)
46                 {
47                     arr_draw[(i - 1) * (n + 2) + j] ^= arr_res[i * (n + 2) + j];
48                     arr_draw[i * (n + 2) + (j - 1)] ^= arr_res[i * (n + 2) + j];
49                     arr_draw[i * (n + 2) + (j + 1)] ^= arr_res[i * (n + 2) + j];
50                     arr_draw[(i + 1) * (n + 2) + j] ^= arr_res[i * (n + 2) + j];
51                     arr_draw[i * (n + 2) + j] ^= arr_res[i * (n + 2) + j];
52                 }
53                 memcpy(&arr_res[(i + 1) * (n + 2)],&arr_draw[i * (n + 2)],sizeof(bool) * (n + 2));
54             }
55             for(i = 1; i <= n; ++i) if(arr_draw[n * (n + 2) + i]) break;
56             if(i > n) break;
57             else
58             {
59                 memcpy(arr_draw,arr_draw_save,sizeof(bool) * (n + 2) * (n + 2));
60 
61                 for(i = n; i > 0; --i) if(!arr_res[1 *(n + 2) + i]) break;
62                 while(i <= n) {arr_res[1 * (n + 2) + i] = !arr_res[1 * (n + 2) + i]; ++i;}
63 
64                 for(i = 1; i <= n; ++i) {if(arr_res[1 * (n + 2) + i]) break;}
65                 if(i > n) {flag = 0; break;}
66             }
67         }
68 
69         int count = 0;
70         if(flag)
71         {
72             for(i = 1; i <= n; ++i)
73             {
74                 for(j = 1; j <= n; ++j)
75                 {
76                     count += arr_res[i * (n + 2) + j];
77                 }
78             }
79             cout<<count<<endl;
80         }
81         else cout<<"inf"<<endl;
82 
83         delete [] arr_draw;
84         delete [] arr_draw_save;
85         delete [] arr_res;
86         
87     }
88     return 0;
89 }
原文地址:https://www.cnblogs.com/mobileliker/p/3549804.html