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 }