标签:show 左右 hat initial std win 黑白棋 its and
Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
题意:
每次取一颗黑白棋子对其进行翻转,那么的它的上下左右四个方向的棋子也会跟着翻转。问至少需要操作多少次,可以使棋盘的棋子全为黑色或者白色。
题解:
首先可以得出一个结论,那就是操作过程中对每个棋子最多只翻转一次。那么4*4的棋盘最多只操作16次就能得到结果,棋盘的可能情况有2^16种。
我们可以DFS(递归)求解。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; bool maze[5][5]; int st; int dx[5]={0,0,0,1,-1},dy[5]={0,1,-1,0,0}; bool flag; bool check()//判断棋盘是否全为同色 { for(int i=0;i<4;i++) for(int j=0;j<4;j++) { if(maze[i][j]!=maze[0][0]) return false; } return true; } void flip(int x,int y)//对棋子进行翻转 { for(int i=0;i<5;i++) { int nx=x+dx[i],ny=y+dy[i]; if(0<=nx&&nx<4&&0<=ny&&ny<4) maze[nx][ny]=!maze[nx][ny]; } } void dfs(int x,int y,int k) { if(k==st&&check())//k为翻转的次数 { flag=true; return ; } if(flag||x==4) return ; flip(x,y); if(y<3) dfs(x,y+1,k+1); else dfs(x+1,0,k+1); flip(x,y);//状态回溯 if(y<3) dfs(x,y+1,k); else dfs(x+1,0,k); } int main() { for(int i=0;i<4;i++) for(int j=0;j<4;j++) { char x; cin>>x; if(x==‘b‘) maze[i][j]=true; else maze[i][j]=false; } flag=false; for(st=0;st<=16;st++)//枚举需要翻转的次数 { dfs(0,0,0); if(flag) break; } if(flag) cout<<st<<endl; else cout<<"Impossible"<<endl; return 0; }
标签:show 左右 hat initial std win 黑白棋 its and
原文地址:http://www.cnblogs.com/orion7/p/7469236.html