#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 1000000//质数
using namespace std;
typedef int state[9];//每种情况 的状态
state st[maxn],aim;
//list <int> v[maxnlen];
int dist[maxn];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int contor[]={0,1, 2, 6, 24, 120,720, 5040, 40320};
bool find_case[maxn];
bool Contor(state& s);
int bfs();
int main()
{
int i;
for(i=0;i<9;i++)
scanf("%d",&st[1][i]);
for(i=0;i<9;i++)
scanf("%d",&aim[i]);
int ans=bfs();
if(ans>0)
printf("%d",ans);
else
printf("-1\n");
return 0;
}
/*
bool hash(state& s)
{
int x=0,i;
for(i=0;i<9;i++)
x= x*10+s[i];
for(list <int> :: iterator p=v[x%maxnlen].begin(); p != v[x%maxnlen].end();p++)
if(*p == x)
return false;
v[x%maxn].push_back(x);
return true;
}
*/
bool Contor(state& s)
{
int x=0,i;
for(i=8;i>=0;i--)
x += s[i]*contor[i];
if(find_case[x]==1)
return 0;
else
{
find_case[x]=1;
return 1;
}
}
int bfs()
{
int f=1,r=2;
while(f<r)
{
int z,d,x,y;
state& s=st[f];
if(!memcmp(aim,s,sizeof(s)))//判断
return dist[f];
for(z=0;z<9;z++)
if(s[z]==0)
break;
x=z/3;y=z%3;
for(d=0;d<4;d++)//移动
{
int nx,ny,nz;//移动后的坐标
nx=x+dx[d];
ny=y+dy[d];
nz=nx*3+ny;
if((nx>0&&nx<3)&&(ny>=0&&ny<3))//OK
{
state& t=st[r];
memcpy(&t,&s,sizeof(s));
t[nz]=s[z];//复制
t[z]=s[nz];
dist[r]=dist[f]+1;
if(Contor(st[r]))
r++;
}
}
f++;
}
return 0;
}
八中OJ——1849 八数码 的错误代码
最新推荐文章于 2020-11-15 21:34:33 发布