标签:
Description
Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
题目大意:就是给你一个4*4的棋盘,通过翻转棋子来让整个棋盘变为全黑或全白,问几步可完成操作。
注意:翻转其某个棋子时,其上下左右都要做相应的翻转,即黑变白,白变黑。
1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 bool chess[6][6]= {{false}}; 5 int r[6]= {0,0,0,-1,1}; 6 int c[6]= {0,1,-1,0,0}; 7 int step; 8 bool flag; 9 bool reach_all() //判断是否为一种颜色 10 { 11 for(int i=1;i<5;i++) 12 { 13 for(int j=1;j<5;j++) 14 { 15 if(chess[i][j]!=chess[1][1]) 16 return false; 17 } 18 } 19 return true; 20 } 21 void turn(int row,int col) //翻棋 22 { 23 for(int i=0;i<5;i++) 24 chess[row+r[i]][col+c[i]]=!chess[row+r[i]][col+c[i]]; 25 return ; 26 } 27 void dfs(int row,int col,int deep) // 深搜迭代回溯很重要 28 { 29 if(deep==step) 30 { 31 flag=reach_all(); 32 return ; 33 } 34 if(flag||row==5) 35 return ; 36 turn(row,col); //翻棋 37 if(col<4) 38 dfs(row,col+1,deep+1); 39 else 40 dfs(row+1,1,deep+1); 41 turn(row,col); //不符合则翻回来 42 if(col<4) 43 dfs(row,col+1,deep); 44 else 45 dfs(row+1,1,deep); 46 return ; 47 } 48 int main() 49 { 50 char ch; 51 for(int i=1; i<5; i++) 52 { 53 for(int j=1; j<5; j++) 54 { 55 scanf("%c",&ch); 56 if(ch==‘b‘) 57 chess[i][j]=true; 58 } 59 getchar(); //之前忘了写,就一直输出Impossible 60 } 61 for(step=0; step<=16; step++) //枚举每一种情况 62 { 63 dfs(1,1,0); 64 if(flag) 65 break; 66 } 67 if(flag) 68 printf("%d\n",step); 69 else 70 printf("Impossible\n"); 71 return 0; 72 }
标签:
原文地址:http://www.cnblogs.com/cxbky/p/4823518.html