POJ_1753_ Flip Game(枚举)
http://poj.org/problem?id=1753
/*
对于一个函数,一定要清楚他是干什么用的,就如同这里的dfs一样,
它的作用是从(1,1)开始翻 ,翻step次判断是否有满足的青一色。
其中deep是模拟的树的深度,此处是记录翻过得次数。在dfs函数中又
增加了翻棋函数,判断函数,他们的作用都很明显。往后就是,deep不等于
step执行的操作,分为两种a:当前棋子翻过来用deep记录看看后面的有没有满足的,
b:当前棋子不翻往后找有没有满足的,因为dfs函数的作用就是找有没有满足的。
*/
网上用位操作的没看懂,这也是看的网上的自己理解的。
http://user.qzone.qq.com/289065406/blog/1299076400
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # include <stdio.h> 2 # include <string.h> 3 char chess[6][6]={0}; 4 int flag,step; 5 int a[]={-1,1,0,0,0}; 6 int b[]={0,0,-1,1,0}; 7 //意思是行左移行右移,列左移列右移。行列不变, 8 //正好是-1,1,0的组合。 9 int judge_chess()//判断是否为一个颜色。 10 { 11 int i,j,temp=1; 12 for(i=1;i<5;i++) 13 { 14 for(j=1;j<5;j++) 15 if(chess[i][j]!=chess[1][1]) 16 { 17 temp=0; 18 break; 19 } 20 } 21 return temp; 22 } 23 void turn(int r,int c)//翻棋操作。 24 { 25 int i; 26 for(i=0;i<5;i++) 27 { 28 chess[r+a[i]][c+b[i]]=!chess[r+a[i]][c+b[i]]; 29 } 30 } 31 void dfs(int row,int col,int deep) 32 { 33 if(deep==step)//deep指你当前翻得棋子数,只有当翻得妻子书等于step 34 //时才能判断是否是一个颜色,因为你前面的步数逐步增加来找的。 35 { 36 flag=judge_chess(); 37 return; 38 } 39 if(flag==1 || row==5) 40 return;//flag=1说明已经找到,而row=5说明没找到,都要返回。 41 turn(row,col);//翻棋操作。 42 if(col<4) 43 dfs(row,col+1,deep+1);//列加一往后找。 44 else 45 dfs(row+1,1,deep+1); 46 turn(row,col);//如果前面找不到,那么当前棋子不执行翻棋,从下一个操作开始找。 47 if(flag==0) 48 { 49 if(col<4) 50 dfs(row,col+1,deep); 51 else 52 dfs(row+1,1,deep); 53 } 54 return; 55 } 56 int main() 57 { 58 int i,n,j; 59 char ch[4][4]; 60 for(i=0;i<4;i++) 61 { 62 scanf("%s",ch[i]); 63 } 64 for(i=0;i<4;i++) 65 for(j=0;j<4;j++) 66 { 67 if(ch[i][j]=='b') 68 chess[i+1][j+1]=1; 69 } 70 for(step=0;step<=16;step++) 71 { 72 dfs(1,1,0); 73 //对于每一个step都从树根开始搜索,1,1即代表要翻得棋子是(1,1); 74 //因为你的每一步都会进行翻棋操作,如果从step开始之前的棋子便不翻了。 75 if(flag) 76 break; 77 78 } 79 if(flag) 80 printf("%d\n",step); 81 else 82 printf("Impossible\n"); 83 return 0; 84 }