dfs 有翻和不翻两种选择,妙
#include <iostream> using namespace std; int map[4][4]; int next[4][2]= {{0,1},{1,0},{0,-1},{-1,0}}; void turn(int x,int y) { int tx,ty; map[x][y]=-map[x][y]; for(int i=0; i<4; i++) { tx=x+next[i][1]; ty=y+next[i][0]; if(tx<0||ty<0||tx>3||ty>3) continue; map[tx][ty]=-map[tx][ty]; } } bool isOk() { 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; } int ans; int dfs(int x,int y,int step )//有两个选择翻还是不翻 不一定要都翻 { if(isOk()) { if(ans>step) ans=step; return 0; } if(x>=4||y>=4) return 0; int tx=(x+1)%4; int ty=y+(x+1)/4; dfs(tx,ty,step); turn(x,y); dfs(tx,ty,step+1); turn(x,y);//恢复原状 return 0; } int main() { char ch; for(int i=0; i<4; i++) { for(int j=0; j<4; j++) { cin>>ch; if(ch=='b') map[i][j]=1; else map[i][j]=-1; } } ans=999999; dfs(0,0,0); if(ans==999999) cout<<"Impossible"<<endl; else cout<<ans<<endl; return 0; }
2.用位运算压缩状态
首先知道和1 异或改变状态 (0变1,1变0) 和0异或不改变状态,正好对应翻不翻棋子的问题
比如翻第(i,j)个棋子,比如j=2则第i行异或 1110 第i-1行和第i+1 行则异或0100
怎么保存状态 则用a[4] 表示4行
比如a[1]=1110 则a[1]为14
看看别人是怎么读取数据吧
void read() { for(int i=1; i<=4; i++) { for(int j=1; j<=4; j++) { field[i]<<=1; if(getchar()=='b') field[i]|=1; } getchar(); } }
初始化 field为0
我觉得 if(getchar()=='b') field[i]+=(1<<4-j);也可以吧