八数码问题--bfs
1 #include<iostream> 2 #include<cstring> 3 #define max 1000000 4 using namespace std; 5 const int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; 6 string origion; 7 string goal; 8 string state[max]; 9 int vis[370000]; 10 11 bool encode(string str){ //康拖展开 编码 12 int x=1,sum=0,n=8; 13 for(int i=1;i<9;i++){ 14 x=i*x; 15 } 16 for( int i=0 ; i < str.length() ; i++){ 17 if( str[i]<='9' && str[i]>='0' ){ 18 int cnt=0; 19 for(int j=i+1 ; j<str.length() ; j++){ 20 if(str[j]!=' '&& str[j] < str[i]){ 21 cnt++; 22 } 23 } 24 sum+=cnt*x; 25 if(x!=1) 26 x=x/n; 27 n--; 28 } 29 } 30 if(vis[sum]){ 31 vis[sum]=0; 32 return true; 33 } 34 return false; 35 } 36 int bfs(){ 37 state[0]=origion; 38 encode(origion); 39 int front=0,rear=1; 40 int floor=0,amt=1; 41 int temp=0; 42 43 while(front!=rear){ 44 string str1=state[front],str2=str1; 45 front=(front+1)%max; 46 47 if(amt==0){ 48 amt=temp; 49 temp=0; 50 floor++; 51 } 52 if(str1==goal){ 53 return floor; 54 } 55 int pos=0,i,j; 56 while(pos<str1.length()){ 57 if(str1[pos]=='0') break; 58 pos++; 59 } 60 i=pos/6; 61 j=(pos/2)%3; 62 63 for(int k=0;k<4;k++){ 64 str1=str2; 65 int x=i+dir[k][0]; 66 int y=j+dir[k][1]; 67 68 if(x>=0&&x<3&&y>=0&&y<3){ 69 char t=str1[pos]; 70 str1[pos]=str1[x*6+y*2]; 71 str1[x*6+y*2]=t; 72 73 if(encode(str1)){ 74 if( (rear+1)%max == front) 75 return -1; 76 state[rear]=str1; 77 rear = (rear+1)%max; 78 temp++; 79 } 80 81 } 82 } 83 amt--; 84 } 85 return 0; 86 } 87 int main(){ 88 while( getline(cin,origion) && getline(cin,goal)){ 89 memset(vis,-1,sizeof(vis)); 90 cout<<bfs()<<endl; 91 } 92 } 93 /* 94 2 6 4 1 3 7 0 5 8 95 8 1 5 7 3 6 4 0 2 96 */