您的位置:首页 > 其它

康托展开+bfs-2

2017-03-05 14:06 169 查看
#include<bits/stdc++.h>
using namespace std;
const int N=3628800;
char str[12],goal[12];
int book[N+1000];
int f[10];
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int maps[4][4];
void init()
{
f[0]=1;
for(int i=1;i<10;i++) f[i]=f[i-1]*i;
}
struct nodes
{
int p[3][3];
int x,y,step;
}node[N/10+1000];
int cantor(int s[])
{
int ans=0;
for(int i=0;i<9;i++)
{
int num=0;
for(int j=i+1;j<9;j++)
{
if(s[i]>s[j]) num++;
}
ans+=num*f[9-i-1];
}
return ans;
}
int bfs(int startx,int starty,int c,int endc)
{
int head=0,tail=1;
node[head].x=startx,node[head].y=starty,node[head].step=0,book[c]=1;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
node[head].p[i][j]=maps[i][j];
if(c==endc) return 0;
while(head<tail)
{
for(int i=0;i<4;i++)
{
int x=node[head].x,y=node[head].y;
int tx=x+next[i][0],ty=y+next[i][1];
if(tx<0||tx>=3||ty<0||ty>=3) continue;
int temp=node[head].p[x][y];
node[head].p[x][y]=node[head].p[tx][ty];node[head].p[tx][ty]=temp;
int ss[12],l=0;
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
ss[l++]=node[head].p[j][k];
int temp1=cantor(ss);
if(book[temp1])
{
int temp=node[head].p[x][y];
node[head].p[x][y]=node[head].p[tx][ty];node[head].p[tx][ty]=temp;
continue;
}
if(temp1==endc) return node[head].step+1;
book[temp1]=1;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
node[tail].p[i][j]=node[head].p[i][j];
node[tail].x=tx,node[tail].y=ty,node[tail++].step=node[head].step+1;
temp=node[head].p[x][y];
node[head].p[x][y]=node[head].p[tx][ty];node[head].p[tx][ty]=temp;
}
head++;
}
return -1;
}
int main()
{
init();
scanf("%s%s",str,goal);
int k=0,startx,starty,endc,c;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
if(str[k]=='.'){startx=i,starty=j,k++;continue;}
maps[i][j]=str[k++]-'0';
}
int s[12];
for(int i=0;i<9;i++)
{
if(str[i]=='.') {s[i]=0;continue;}
s[i]=str[i]-'0';
}
c=cantor(s);
for(int i=0;i<9;i++)
{
if(goal[i]=='.') {s[i]=0;continue;}
s[i]=goal[i]-'0';
}
endc=cantor(s);
printf("%d\n",bfs(startx,starty,c,endc));
return 0;
}
九宫重排
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: