题意:给定两个四位素数作为终点和起点,每次可以改变起点数的某一位,且改变后的数仍然是素数,如果变换成终点数字输出最短步数,否则输出Impossible。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1e4+10;
int d[maxn];
int n,m;
int a[4];
bool is_prime(int v){
for(int i=2;i<=sqrt(v);i++){
if(v%i==0)return false;
}
return true;
}
void bfs(){
memset(d,-1,sizeof(d));
queue<int>q;
q.push(n);
d[n]=0;
while(!q.empty()){
int u=q.front();
q.pop();
if(u==m){
printf("%d\n",d[u]);
return ;
}
int t=u;
for(int i=3;i>=0;i--){
a[i]=t%10;
t/=10;
}
for(int i=0;i<4;i++){
int temp=a[i];
for(int j=0;j<=9;j++){
if(j!=a[i]){
if(i==0 && j==0)continue;
a[i]=j;
int v=0;
for(int k=0;k<4;k++)
v=v*10+a[k];
if(d[v]==-1&&is_prime(v)){
q.push(v);
d[v]=d[u]+1;
}
}
}
a[i]=temp; //改回来
}
}
printf("Impossible\n");
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
bfs();
}
return 0;
}