poj 1753
http://poj.org/problem?id=1753
//自己是看了网上的答案写出来开的。。对搜素理解还是不深啊。。。
//这一题还有一个比较巧的地方,就是用二进制的异或^来完成状态的转化。。1^1=0,0^1=1,0^0=0,1^0=1;
1 #include <iostream> 2 #include<queue> 3 using namespace std; 4 int step[65535];//2^16 5 bool flag[65535];//防止重复搜索 6 unsigned qState[65535]; 7 int rear = 0,top = 0; 8 void init(){ 9 char c; 10 int temp = 0; 11 for(int i=0;i<4;i++) 12 for(int j=0;j<4;j++){ 13 cin>>c; 14 if(c=='b'){ 15 temp |=(1<<(i*4+j)); 16 } 17 } 18 qState[rear++] = temp; 19 flag[temp]=true; 20 }
// 对四周的棋子的影响。。。 21 int mve(int state,int i){ 22 int temp = 0; 23 temp |= (1<<i); 24 if((i+1)%4!=0)//i的位置右,且不比在最右 25 temp |= (1<<(i+1)); 26 if(i%4!=0)//左,且不在最左 27 temp |= (1<<(i-1)); 28 if((i+4)<16)//下 29 temp |= (1<<(i+4)); 30 if((i-4)>=0)//上 31 temp |= (1<<(i-4)); 32 return temp^state;//状态的转化。。 33 }
//广搜,,找的合适的状态 34 bool bfs(){ 35 while(rear>top){ 36 int state = qState[top++];//取节点 37 for(int i=0;i<16;i++){ 38 int temp = mve(state,i); 39 if(state==0||state==65535){//全白或者是全黑 40 cout<<step[state]; 41 return true; 42 } 43 else if(!flag[temp]){//存节点 44 qState[rear++] = temp; 45 flag[temp] = true; 46 step[temp] = step[state]+1; 47 } 48 } 49 } 50 return false; 51 } 52 int main() 53 { 54 init(); 55 if(!bfs()) cout<<"Impossible"<<endl; 56 return 0; 57 }