#include<iostream>
#include<queue>
using namespace std;
int a,b,n,num;
int lef[4];
int rig[4];
int mid[4];
int visited[10005];
int d[10005];
int getnum(int aa[]){
return 1000*aa[0]+100*aa[1]+10*aa[2]+aa[3];
}
//这个函数写错了
void putin(int bb,int cc[]){
//刚开始没有对cc进行初始化,结果导致三位数的结果,最高位还保留有原来的数值而不是0,
//但是最后证明是不必要的,因为必须为四位数(验证结果)
//memset(cc,0,sizeof(cc));
int i=3;
while(bb){
cc[i]=bb%10;
bb=bb/10;
i--;
}
}
bool isPrime(int p){
if(p==0||p==1)
return false;
for(int i=2;i*i<=p;i++)
if(p%i==0)
return false;
return true;
}
int main(){
scanf("%d",&n);
queue<int> q;
while(n--){
while(!q.empty())
q.pop();
scanf("%d%d",&a,&b);
memset(visited,0,sizeof(visited));
memset(d,0,sizeof(d));
num=3;
putin(a,lef);
putin(b,rig);
int ll=getnum(lef);
visited[ll]=1;
q.push(ll);
bool flag=false;
while(!q.empty()){
int tmp=q.front();
q.pop();
putin(tmp,mid);
if(tmp==getnum(rig)){
flag=true;
break;
}
int t;
for(int i=0;i<4;i++){
t=mid[i];//这个不能写到j循环的内部
for(int j=0;j<10;j++){
mid[i]=j;
if(visited[getnum(mid)]==0&&isPrime(getnum(mid))&&getnum(mid)>=1000){
visited[getnum(mid)]=1;
d[getnum(mid)]=d[tmp]+1;
q.push(getnum(mid));
}
}
mid[i]=t;
}
}
if(flag){
printf("%d\n",d[getnum(rig)]);
}else{
printf("Impossible\n");
}
}
return 0;
}
POJ 3126 广搜
最新推荐文章于 2021-08-16 10:17:32 发布