双向搜索,直接把字符串转换成整型来判重。。。
代码有点冗余。。。
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<map>
#include<queue>
using namespace std;
bool vis1[10005];
bool vis2[10005];
char b[5];
inline int cal(char *a)
{
int s=0;
for(int i=0;i<4;i++)
{
s=s*10+a[i]-'0';
}
return s;
}
struct node{int dis;char a[5];};
void trans(node &x,int k,int kk)
{
char tmp=x.a[k];
x.a[k]=x.a[kk];
x.a[kk]=tmp;
}
int bfs(char *a)
{
if(strcmp(a,b)==0) return 0;
node front1,front2,rear1,rear2;
queue<node> q1;
queue<node> q2;
strcpy(front1.a,a);
front1.dis=0;
strcpy(front2.a,b);
front2.dis=0;
q1.push(front1);
q2.push(front2);
rear1=front1;
rear2=front2;
vis1[cal(a)]=1;
vis2[cal(b)]=1;
int k1=1,kk1=0,k2=1,kk2=0;
while(!q1.empty()&&!q2.empty())
{
while(k1--)
{
front1=q1.front();q1.pop();
for(int i=0;i<4;i++)
{
rear1=front1;
if(rear1.a[i]=='9')
{
rear1.a[i]='1';
rear1.dis=front1.dis+1;
int x=cal(rear1.a);
if(vis2[x]) return rear1.dis+front2.dis;
if(!vis1[x])
{
vis1[x]=1;
q1.push(rear1);
kk1++;
}
}
else
{
rear1.a[i]+=1;
rear1.dis=front1.dis+1;
int x=cal(rear1.a);
if(vis2[x]) return rear1.dis+front2.dis;
if(!vis1[x])
{
vis1[x]=1;
q1.push(rear1);
kk1++;
}
}
}
for(int i=0;i<4;i++) //减1
{
rear1=front1;
if(rear1.a[i]=='1')
{
rear1.a[i]='9';
rear1.dis=front1.dis+1;
int x=cal(rear1.a);
if(vis2[x]) return rear1.dis+front2.dis;
if(!vis1[x])
{
vis1[x]=1;
q1.push(rear1);
kk1++;
}
}
else
{
rear1.a[i]-=1;
rear1.dis=front1.dis+1;
int x=cal(rear1.a);
if(vis2[x]) return rear1.dis+front2.dis;
if(!vis1[x])
{
vis1[x]=1;
q1.push(rear1);
kk1++;
}
}
}
for(int i=0;i<4;i++) //交换
{
rear1=front1;
if(i>0)
{
trans(rear1,i,i-1);
rear1.dis=front1.dis+1;
int x=cal(rear1.a);
if(vis2[x]) return rear1.dis+front2.dis;
if(!vis1[x])
{
vis1[x]=1;
q1.push(rear1);
kk1++;
}
}
rear1=front1;
if(i<3)
{
trans(rear1,i,i+1);
rear1.dis=front1.dis+1;
int x=cal(rear1.a);
if(vis2[x]) return rear1.dis+front2.dis;
if(!vis1[x])
{
vis1[x]=1;
q1.push(rear1);
kk1++;
}
}
}
}
k1=kk1,kk1=0;
front1.dis++;
while(k2--)
{
front2=q2.front();q2.pop();
for(int i=0;i<4;i++) //加1
{
rear2=front2;
if(rear2.a[i]=='9')
{
rear2.a[i]='1';
rear2.dis=front2.dis+1;
int x=cal(rear2.a);
if(vis1[x]) return rear2.dis+front1.dis;
if(!vis2[x])
{
vis2[x]=1;
q2.push(rear2);
kk2++;
}
}
else
{
rear2.a[i]+=1;
rear2.dis=front2.dis+1;
int x=cal(rear2.a);
if(vis1[x]) return rear2.dis+front1.dis;
if(!vis2[x])
{
vis2[x]=1;
q2.push(rear2);
kk2++;
}
}
}
for(int i=0;i<4;i++) //减1
{
rear2=front2;
if(rear2.a[i]=='1')
{
rear2.a[i]='9';
rear2.dis=front2.dis+1;
int x=cal(rear2.a);
if(vis1[x]) return rear2.dis+front1.dis;
if(!vis2[x])
{
vis2[x]=1;
q2.push(rear2);
kk2++;
}
}
else
{
rear2.a[i]-=1;
rear2.dis=front2.dis+1;
int x=cal(rear2.a);
if(vis1[x]) return rear2.dis+front1.dis;
if(!vis2[x])
{
vis2[x]=1;
q2.push(rear2);
kk2++;
}
}
}
for(int i=0;i<4;i++) //交换
{
rear2=front2;
if(i>0)
{
trans(rear2,i,i-1);
rear2.dis=front2.dis+1;
int x=cal(rear2.a);
if(vis1[x]) return rear2.dis+front1.dis;
if(!vis2[x])
{
vis2[x]=1;
q2.push(rear2);
kk2++;
}
}
rear2=front2;
if(i<3)
{
trans(rear2,i,i+1);
rear2.dis=front2.dis+1;
int x=cal(rear2.a);
if(vis1[x]) return rear2.dis+front1.dis;
if(!vis2[x])
{
vis2[x]=1;
q2.push(rear2);
kk2++;
}
}
}
}
k2=kk2,kk2=0;
front2.dis++;
}
}
int main()
{
char a[5];
int t;
scanf("%d",&t);
while(t--)
{
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
scanf("%s",a);
scanf("%s",b);
printf("%d\n",bfs(a));
}
return 0;
}