prime path (bfs)
#include <stdio.h> #include <cmath> #include <cstring> #include <queue> #define maxs 100005 using namespace std; int b[maxs],visit[maxs]; void prtable() { int i,j; for (i=1000;i<10000;i++) { b[i]=1; for (j=2;j<=sqrt(i);j++) //不要忘了等号 if (i%j==0) {b[i]=0;break;} } //借鉴的打表 } int change (int s , int i) { int j,a[5]; for(j=0;j<4;j++)//数组实现 { a[j]=s%10; s/=10; } a[i-1]=0; for(j=0;j<4;j++) {s+=a[j]*pow(10,j);} return s; } int main() { int n,a,c,time,i,t,tt,s,s1,j,fine; scanf("%d",&n); prtable(); while (n--) { scanf("%d%d",&a,&c); if (a==c) {printf("0\n");continue;} time=0,fine=0; queue <int> Q; memset(visit,0,sizeof(visit)); Q.push (a); visit[a]=1; while (!Q.empty() && !fine) { tt=Q.size();//队列里元素的个数 time++; while(tt--) { s=Q.front(); Q.pop(); for (i=1;i<=4;i++) { t=change(s,i); for (j=0;j<=9;j++) { s1=t+j*pow(10,i-1); if (s1==c) {fine=1;goto er;} else if( b[s1] && !visit[s1]) {Q.push(s1);visit[s1]=1;} } } } } er: if(fine) printf("%d\n",time); else printf("Impossible\n"); } return 0; }