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计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。
OpenJudge 2813 画家问题 / Poj 1681 Painter's Problem
输入
第一行是个整数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 }

 

你可能感兴趣的:(paint)