http://icpc.upc.edu.cn/problem.php?id=1581
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct str
{
int now[9],x,step;
} init,goal,p;
int vis[4000000],E[9]= {1,1,2,6,24,120,720,5040,40320},m[4][2] = {-1,0,1,0,0,-1,0,1};
queue<str>Q;
int cantor(int *A)
{
int i,j,s=0,n;
for(i=0; i<9; i++)
{
n=0;
for(j=i+1; j<9; j++)
if(A[i]>A[j])
n++;
s+=n*E[8-i];
}
return s;
}
void bfs()
{
int t,g=cantor(goal.now);
Q.push(init);
vis[cantor(init.now)]=1;
while(Q.size())
{
p=Q.front();
if(cantor(p.now)==g)
{
printf("%d\n",p.step);
return;
}
int i,x,y,x0,y0;
x=p.x/3,y=p.x%3;
for(i=0; i<4; i++)
{
x0=x+m[i][0];
y0=y+m[i][1];
if (x0<0||x0>2||y0<0||y0>2)
continue;
str q=p;
q.x=x0*3+y0;
q.step++;
q.now[p.x]=q.now[q.x];
q.now[q.x]=0;
t=cantor(q.now);
if(!vis[t])
{
vis[t]=1;
Q.push(q);
}
}
Q.pop();
}
printf("-1\n");
}
int main()
{
int i;
char a[100],b[100];
scanf("%s%s",a,b);
for(i=0; i<9; i++)
{
if(a[i]!='.')
init.now[i]=a[i]-'0';
else
init.x=i;
if(b[i]!='.')
goal.now[i]=b[i]-'0';
}
bfs();
}