1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 x
1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8 9 x 10 12 9 10 x 12 9 10 11 12 9 10 11 12 13 14 11 15 13 14 11 15 13 14 x 15 13 14 15 x r-> d-> r->
2 3 4 1 5 x 7 6 8
ullddrurdllurdruldr
八数码问题。
BFS+康拓展开
#include <iostream> #include <stdio.h> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #define N 400000 using namespace std; struct node { int pos,val; char a[9]; string path; }cur,now; int f[15]= {40320,5040,720,120,24,6,2,1,1}; //康拖展开判重 int dx[4]={-1,1,0,0};//上 下 左 右 int dy[4]={0,0,-1,1}; char dir[5]="durl"; string anspath[N],ans; int vis[N]; char c; queue<node>q; int kanto(char *ss) { int ans=0; int num; for(int i=0;i<9;i++) { num=0; for(int j=i+1;j<9;j++) { if(ss[i]>ss[j]) num++; } ans+=num*f[i]; } return ans+1; } void bfs() { int x,y,t,t1,tempv; char temps[9]; memset(vis,0,sizeof vis); while(!q.empty())q.pop(); for(int i=0;i<8;i++) cur.a[i]=i+1-0+'0'; cur.a[8]='0'; cur.pos=9; cur.path=""; cur.val=kanto(cur.a); vis[cur.val]=1; anspath[cur.val]=cur.path; q.push(cur); while(!q.empty()) { now=q.front(); t=now.pos; y=t%3; if(y==0) y=3; x=(t-y)/3+1; q.pop(); int nx,ny; for(int i=0;i<4;i++) { nx=x+dx[i]; ny=y+dy[i];//眼睛都看瞎了,才看到写成n=y=dy[i];(⊙o⊙)… t1=(nx-1)*3+ny; memcpy(temps,now.a,sizeof(temps)); temps[t-1]=now.a[t1-1]; //模拟移动 temps[t1-1]='0'; tempv=kanto(temps); if(nx>=1 && nx<=3 && ny>=1 && ny<=3 && !vis[tempv]) { vis[tempv]=1; cur.pos=t1; cur.path=now.path+dir[i]; memcpy(cur.a,temps,sizeof(temps)); cur.val=tempv; q.push(cur); anspath[cur.val]=cur.path; } } } } int main() { // f[0]=1; // for(int i=1;i<9;i++) // f[i]=f[i-1]*i; bfs(); while(cin>>c) { if(c=='x') { cur.pos=1; cur.a[0]='0'; } else cur.a[0]=c; for(int i=1;i<9;i++) { cin>>c; if(c=='x') { cur.pos=i+1; cur.a[i]='0'; } else cur.a[i]=c; } cur.val=kanto(cur.a); int flag; if(vis[cur.val]) { flag=anspath[cur.val].length(); for(int i=flag-1;i>=0;i--) printf("%c",anspath[cur.val][i]); } else printf("unsolvable"); cout<<endl; } return 0; }
原文:http://blog.csdn.net/wust_zjx/article/details/44681515