#include<stdio.h>
#include<string.h>
int n1, n2;
bool prim[10000];
int value[10000];
int q[11000];
int c[4]= {1, 10, 100, 1000};
void prime()
{ int i,j;
prim[0]=prim[1]=false;
for(i=2;i<5000;i++)
if(prim[i]==true){
for(j=i*2;j<10000;j=j+i)
prim[j]=false;
}
}
int BFS()
{int front=0,rear=0,temp,i,digit,j,changed;
q[rear++]=n1;
value[n1]=0;
while(front<rear){
temp=q[front++];
if(temp==n2)
return 1;
for(i=0;i<4;i++){
digit=(temp/c[i])%10;
for(j=0;j<10;j++){
changed=temp-digit*c[i]+j*c[i];
if(value[changed]==-1&&prim[changed]&&changed>=1000&&j!=digit){
q[rear++]=changed;
value[changed]=value[temp]+1;
}
}
}
}
return 0;
}
int main()
{ int k;
memset(prim,true,sizeof(prim));
scanf("%d",&k);
prime();
while(k--){
scanf("%d%d",&n1,&n2);
memset(value,-1,sizeof(value));
if(prim[n1]&&prim[n2]){
if(BFS()==1)
printf("%d\n",value[n2]);
else
printf("Impossible\n");
}
else
printf("Impossible\n");
}
return 0;
}
学习了一个简单的BFS。。至于BFS是什么,广度优先遍历。。。。。广度是什么的呢,应该就是范围的吧,把所有可能的情况搜索出来的,那不是和暴搜一样的了?
先做题,再总结的吧。