Description
Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
题解:枚举翻转次数再暴力搜索。其实是简单题。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; char map[5][5]; int d[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; int ans; bool judge() //全部同色 { for(int i = 0;i < 4;i++) { for(int j = 0;j < 4;j++) { if(map[i][j] != map[0][0]) { return false; } } } return true; } void flip(int n) //翻转 { int x; int y; if(n % 4 == 0) //把n看做是格子是第几个,就是把格子看成第1-16个(编号), { //此时可以得到坐标和编号的关系 x = n / 4 - 1; } else { x = n / 4; } y = n - 4 * x - 1; map[x][y] = (map[x][y] == 'b' ? 'w' : 'b'); for(int i = 0;i < 4;i++) { int xx = x + d[i][0]; int yy = y + d[i][1]; if(xx >= 0 && xx < 4 && yy >= 0 && yy < 4) { map[xx][yy] = (map[xx][yy] == 'b' ? 'w' : 'b'); } } } bool dfs(int t,int s,int n) { if(n > 16) //只能翻转16个 { return false; } if(s == t) //翻转次数到了 { if(judge()) //全部颜色一致?? { return true; } return false; } flip(n + 1); //翻转 if(dfs(t,s + 1,n + 1)) //表示翻转 { return true; } flip(n + 1); //翻转回去,下面表示不翻转该点 if(dfs(t,s,n + 1)) { return true; } return false; } int main() { while(scanf("%s",map[0]) != EOF) { for(int i = 1;i < 4;i++) { scanf("%s",map[i]); } bool flag = true; for(int i = 0;i < 4;i++) { for(int j = 0;j < 4;j++) { if(map[0][0] != map[i][j]) { flag = false; break; } } } if(flag) { printf("0\n"); continue; } flag = true; for(int i = 1;i <= 16;i++) { if(dfs(i,0,0)) //i表示翻转次数,0表示翻转了几次,0表示翻转的是第几个 { printf("%d\n",i); break; } if(i == 16) { flag = false; } } if(!flag) { printf("Impossible\n"); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/wang2534499/article/details/47615805