参考:http://blog.csdn.net/u010372095/article/details/20077681
#include <iostream>
#include <queue>
#include <cstring>
#include <string>
using namespace std;
#define MAX 10
#define MAXK 9
#define MAXC 400000
#define MAXD 4
int fac[9]={1,1,2,6,24,120,720,5040,40320};
int dir[4][2]={-1,0,1,0,0,-1,0,1}; //上下左右四个方向交换
struct node{
int loc,c[MAX],step;
};
void trans(int a[],string b)
{
for (int i=0;i<MAXK;i++)
{
if (b[i]>='1'&&b[i]<='8')
{
a[i]=b[i]-'0';
} else {
a[i]=9;
}
}
}
//康托展开
int cantuo(int s[],int e)
{
int i,j,temp,num=0;
for (i=0;i<e;i++)
{
temp=0;
for (j=i+1;j<=e;j++)
{
if (s[j]<s[i])
{
temp++;
}
}
num+=fac[e-i]*temp;
}
return num+1;
}
int find(int c[],int num1,int num2)
{
if (num1==num2) return 0;
queue<node>q;
node now,next;
bool vis[MAXC];
memset(vis,0,sizeof(vis));
for (int i=0;i<MAXK;i++)
{
if (c[i]==9)
now.loc=i;
now.c[i]=c[i];
}
now.step=0;
vis[num1]=true;
q.push(now);
while(!q.empty()){
now=q.front(); q.pop();
for (int d=0;d<MAXD;d++)
{
int x=now.loc/3+dir[d][0];
int y=now.loc%3+dir[d][1];
if (x>=0&&y>=0&&x<3&&y<3)
{
next=now;
next.loc=3*x+y;
next.step++;
next.c[next.loc]=9;
next.c[now.loc]=now.c[next.loc];
int num=cantuo(next.c,8);
if (num==num2) return next.step;
if (!vis[num])
{
vis[num]=!vis[num];
q.push(next);
}
}
}
}
return -1;
}
int main()
{
string bc,ac;
int c[MAX],tc[MAX];
int num1,num2;
while(cin>>bc>>ac){
trans(c,bc);
trans(tc,ac);
num1=cantuo(c,8);
num2=cantuo(tc,8);
cout<<find(c,num1,num2);
}
return 0;
}