Flip Game

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

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 
 6 char s[6][6];
 7 int a[6][6];
 8 int deep,step,flag;
 9 void inti(int row,int c)
10 {
11     a[row-1][c]=!a[row-1][c];
12     a[row][c+1]=!a[row][c+1];
13     a[row+1][c]=!a[row+1][c];
14     a[row][c-1]=!a[row][c-1];
15     a[row][c]=!a[row][c];
16 }
17 int check()
18 {
19     for(int i=1; i<=4; i++)
20     {
21         for(int j=1; j<=4; j++)
22         {
23             if(a[i][j]!=a[1][1]) return 0;
24         }
25     }
26     return 1;
27 }
28 void dfs(int row,int c,int deep)
29 {
30     if(deep==step)
31     {
32         flag=check();
33         return;
34     }
35     if(flag||row==5) return;
36     inti(row,c);
37     if(c<4)
38         dfs(row,c+1,deep+1);
39     else
40         dfs(row+1,1,deep+1);
41 
42     inti(row,c);
43     if(c<4)
44         dfs(row,c+1,deep);
45     else
46         dfs(row+1,1,deep);
47     return ;
48 }
49 int main()
50 {
51     memset(a,0,sizeof(a));
52     for(int i=0; i<4; i++)
53     {
54         scanf("%s",s[i]);
55     }
56     for(int i=0; i<4; i++)
57     {
58         for(int j=0; j<4; j++)
59         {
60             if(s[i][j]=='b')
61                 a[i+1][j+1]=1;
62         }
63     }
64     for(step=0; step<=16; step++)
65     {
66         dfs(1,1,0);
67         if(flag)
68         {
69             printf("%d\n",step);
70             break;
71         }
72     }
73     if(!flag) printf("Impossible\n");
74     return 0;
75 }
View Code

 

posted @ 2013-08-02 16:15  null1019  阅读(166)  评论(0编辑  收藏  举报