//poj 1077 Eight #include//单向bfs和康托压缩 #include using namespace std; bool visited[1000000]; int fac[]={ 1,1,2,6,24,120,720,5040,40320,362880}; //9!表 int cantor(int arr[]) { int temp,num=1; //当排列为1 2 3 4 5 6 7 8 9时康托值等于1 for(int i=0;i<9;++i) { temp=0; for(int j=i+1;j<9;++j) if(arr[j] >ch; if(ch=='x') arr[i]=9,table[0].sub=i; else arr[i]=int(ch-48); } table[0].pre=-1;table[0].num=to_num(arr); visited[cantor(arr)]=1; int head=0,rear=0; while(head<=rear) { to_arr(arr,table[head].num); if(cantor(arr)==1) //当排列为1 2 3 4 5 6 7 8 9时康托值等于1 { string str; int i=head; while(i!=0) { str.insert(str.begin(),table[i].ch); i=table[i].pre; } cout< < =0&&tx<3&&ty>=0&&ty<3) { swap(arr[x*3+y],arr[tx*3+ty]); if(visited[cantor(arr)]==0) { ++rear; table[rear].num=to_num(arr); table[rear].ch=pos[i]; table[rear].pre=head; table[rear].sub=tx*3+ty; visited[cantor(arr)]=1; } swap(arr[x*3+y],arr[tx*3+ty]); } } head++; } cout<<"unsolvable\n"; return 0; }