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