1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<queue> 5 #include<stack> 6 using namespace std; 7 typedef struct node 8 { 9 int f,g,h; 10 int x,y; 11 char map[5][5]; 12 friend bool operator <(node a,node b) 13 { 14 if (a.f==b.f) return (a.g<b.g); 15 return (a.f>b.f); 16 } 17 }; 18 node start,next; 19 int jie[10],vis[1000005],pre[1000005]; 20 char ans[1000005],str[1005]; 21 int to[4][2]={1,0,0,1,-1,0,0,-1}; 22 char to_c[5]="drul"; 23 int check()//判断可否 24 { 25 int ss[20]; 26 int i,j,cnt=0; 27 for (i=0;i<3;i++) 28 for (j=0;j<3;j++) 29 if (start.map[i][j]!='x') 30 { 31 ss[cnt]=start.map[i][j]; 32 cnt++; 33 } 34 cnt=0; 35 for (i=0;i<9;i++) 36 for (j=i+1;j<9;j++) 37 if (ss[j]<ss[i]) cnt++; 38 if (cnt%2==0) return 1; 39 return 0; 40 } 41 int solve(node a) //康托 42 { 43 int ss[20]; 44 int i,j,cnt=0,tt,temp; 45 for (i=0;i<3;i++) 46 for (j=0;j<3;j++) 47 { 48 ss[cnt]=a.map[i][j]; 49 cnt++; 50 } 51 temp=0; 52 for (i=0;i<9;i++) 53 { 54 tt=0; 55 for (j=i+1;j<9;j++) 56 if (ss[j]<ss[i]) tt++; 57 temp=temp+jie[8-i]*tt; 58 } 59 return temp; 60 } 61 int geth(node a)//得到H值 62 { 63 int i,j,temp=0,z,xx,yy; 64 for (i=0;i<3;i++) 65 for (j=0;j<3;j++) 66 if (a.map[i][j]!='x') 67 { 68 z=a.map[i][j]-'0'; 69 xx=(z-1)/3; 70 yy=z-1-xx*3; 71 temp+=abs(xx-i)+abs(yy-j); 72 } 73 return temp; 74 } 75 void bfs()//A* 76 { 77 int k_s,k_n,i; 78 node a; 79 priority_queue<node>q; 80 while (!q.empty()) q.pop(); 81 memset(vis,0,sizeof(vis)); 82 start.g=0; start.f=start.h=geth(start); 83 vis[solve(start)]=1; 84 q.push(start); 85 while (!q.empty()) 86 { 87 a=q.top(); 88 q.pop(); 89 k_s=solve(a); 90 for (i=0;i<4;i++) 91 { 92 next=a; 93 next.x+=to[i][0]; 94 next.y+=to[i][1]; 95 if (next.x<0||next.y<0||next.x>2||next.y>2) continue; 96 next.map[a.x][a.y]=a.map[next.x][next.y]; 97 next.map[next.x][next.y]='x'; 98 next.g++; next.h=geth(next); 99 next.f=next.g+next.h; 100 k_n=solve(next); 101 if (vis[k_n]==1) continue; 102 vis[k_n]=1; 103 q.push(next); 104 pre[k_n]=k_s; 105 ans[k_n]=to_c[i]; 106 if (k_n==0) return; 107 } 108 109 } 110 return; 111 } 112 int main() 113 { 114 int i,x,y,len,judge,now; 115 jie[0]=1; 116 for (i=1;i<=9;i++) jie[i]=jie[i-1]*i; 117 while (gets(str)) 118 { 119 x=y=0; len=strlen(str); 120 for (i=0;i<len;i++) 121 if (str[i]>'0'&&str[i]<'9'||str[i]=='x') 122 { 123 start.map[x][y]=str[i]; 124 if (str[i]=='x') 125 { 126 start.x=x; 127 start.y=y; 128 } 129 y++; 130 if (y==3){x++; y=0; } 131 } 132 if (check()==0) {printf("unsolvable\n"); continue; } 133 judge=solve(start); now=0; 134 bfs(); 135 stack<int>s; 136 while (judge!=now) 137 { 138 s.push(ans[now]); 139 now=pre[now]; 140 } 141 while (!s.empty()) 142 { 143 printf("%c",s.top()); 144 s.pop(); 145 } 146 printf("\n"); 147 } 148 return 0; 149 }
http://acm.hdu.edu.cn/showproblem.php?pid=1043