题目链接:点击打开链接
在bfs里,也可用其他方式做,bfs的话思路还是挺简单的,不过因为是四位数,所以搜千的时候要从1开始,注意标记。
//260K 0MS
//C++ 1825B
#include <cstdio>
#include <cstring>
#define N 10000
int sum;
int q[N],dis[N],vis[N];
int a[N],k=0;
void ssh()
{
memset(a,0,sizeof(a));
int i,l;
for(i=2;i<=3200;i++)
if(!a[i])
for(l=i;l*i<=N;l++)
a[l*i]=1;
}
int bfs(int x,int y)
{
memset(vis,0,sizeof(vis));
int in=0,out=0,i;
dis[in]=0;
q[in++]=x;
vis[x]=1;
while(in>out)
{
int di=dis[out];
int k=q[out++];
vis[k]=1;
if(k==y)
{
return di;
}
if(k>=10000||di>=100)
return -1;
int n,l;
n=k%1000;
for(i=1;i<10;i++)
{
int p=i*1000+n;
if(!a[p]&&!vis[p])
{
vis[p]=1;
dis[in]=di+1;
q[in++]=p;
}
}
n=k%100;
l=k/1000;
for(i=0;i<10;i++)
{
int p=l*1000+i*100+n;
if(!a[p]&&!vis[p])
{
vis[p]=1;
dis[in]=di+1;
q[in++]=p;
}
}
n=k%10;
l=k/100;
for(i=0;i<10;i++)
{
int p=l*100+i*10+n;
if(!a[p]&&!vis[p])
{
vis[p]=1;
dis[in]=di+1;
q[in++]=p;
}
}
l=k/10;
for(i=0;i<10;i++)
{
int p=l*10+i;
if(!a[p]&&!vis[p])
{
vis[p]=1;
dis[in]=di+1;
q[in++]=p;
}
}
}
}
int main()
{
ssh();
int i,n,x,y;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x=bfs(x,y);
if(x!=-1)
printf("%d\n",x);
else
printf("Impossible\n");
}
return 0;
}