poj 1753
翻转棋,注意是翻转周围四个的,不是整行列的 汗-_-!
哥的代码风还是不错的
二进制储存状态
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 int n,m,t; 9 int vis[65536]; 10 struct node 11 { 12 int s,t; 13 }st; 14 int flip(int s,int i) //当前的状态,翻第几个棋子 15 { 16 int x=i/4; 17 int y=i%4; 18 s^=(1<<i); //翻选中的棋子 19 if(x>0) s^=(1<<(i-4));//翻转上面的 20 if(y>0) s^=(1<<(i-1));//翻转左边的 21 if(x<3) s^=(1<<(i+4));//翻转下面的 22 if(y<3) s^=(1<<(i+1));//翻转右边的 23 return s; 24 } 25 void bfs() 26 { 27 node now,next; 28 vis[st.s]=1; 29 queue<node> q; 30 q.push(st); 31 while(!q.empty()) 32 { 33 now=q.front(); 34 q.pop(); 35 //printf("%d %d\n",now.s,now.t); 36 if(now.s==65535||now.s==0) //全黑or全白 37 { 38 printf("%d\n",now.t); 39 return; 40 } 41 for(int i=0;i<16;i++) 42 { 43 next.s=flip(now.s,i); 44 next.t=now.t+1; 45 if(!vis[next.s]) 46 { 47 vis[next.s]=1; 48 q.push(next); 49 } 50 } 51 } 52 printf("Impossible\n"); 53 return; 54 } 55 int main() 56 { 57 int i,j,k; 58 //freopen("1.in","r",stdin); 59 char s[5]; 60 st.s=0; 61 for(i=0;i<4;i++) 62 { 63 scanf("%s",s); 64 for(j=0;j<4;j++) 65 if(s[j]=='b') st.s+=1<<(i*4+j); 66 } 67 memset(vis,0,sizeof(vis)); 68 st.t=0; 69 bfs(); 70 return 0; 71 }