标签:des style blog http io ar color os sp
http://poj.org/problem?id=1753
题意:4*4的黑白棋子,给定棋子现在的状态怎样翻棋使棋子变成全黑or全白,但是每翻一次棋子,它的四周的都会改变成相反的棋子,是黑就会变白,是白就会变黑。
分析:一共最多有16步,所以可以枚举这16步,在每一种几步进行搜索,比如0步去搜索,1步去搜索可以不,2步去搜索可以不。。。。。
枚举+dfs
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 31763 | Accepted: 13822 |
Description
Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int ans[6][6]={0}; 6 int r[]={1,0,-1,0}; 7 int c[]={0,1,0,-1}; 8 int step; 9 bool flag=false; 10 bool judge() 11 { 12 int i,j,sum=0; 13 for(i=1;i<=4;i++) 14 for(j=1;j<=4;j++) 15 sum+=ans[i][j]; 16 if(sum==0||sum==16) 17 return true; 18 else 19 return false; 20 } 21 void flip(int x,int y) 22 { 23 int i; 24 if(ans[x][y]==1) 25 ans[x][y]=0; 26 else 27 ans[x][y]=1; 28 for(i=0;i<=3;i++) 29 { 30 if(ans[x+r[i]][y+c[i]]==0) 31 ans[x+r[i]][y+c[i]]=1; 32 else 33 ans[x+r[i]][y+c[i]]=0; 34 } 35 } 36 void dfs(int x,int y,int d) 37 { 38 if(d==step) 39 { 40 flag=judge(); 41 return ; 42 } 43 44 if(flag||x>4) 45 { 46 return ; 47 } 48 flip(x,y);//翻棋 49 if(y<4) 50 dfs(x,y+1,d+1); 51 else 52 dfs(x+1,1,d+1); 53 flip(x,y);//翻回来. 54 if(y<4) 55 dfs(x,y+1,d); 56 else 57 dfs(x+1,1,d); 58 59 } 60 int main() 61 { 62 63 int i,j; 64 char temp; 65 for(i=1;i<=4;i++) 66 { 67 for(j=1;j<=4;j++) 68 { 69 scanf("%c",&temp); 70 if(temp==‘b‘) 71 ans[i][j]=1; 72 } 73 getchar(); 74 } 75 for(step=0;step<=16;step++)//枚举16种步。 76 { 77 78 dfs(1,1,0); 79 if(flag) 80 break; 81 } 82 if(flag) 83 printf("%d\n",step); 84 else 85 printf("Impossible\n"); 86 return 0; 87 }
标签:des style blog http io ar color os sp
原文地址:http://www.cnblogs.com/cancangood/p/4127305.html