POJ 3126 Prime Path
广搜。
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<algorithm> using namespace std; int T; int x,y; int dig[6],tot; int m[20000]; const int INF=0x7FFFFFFF; int f[20000]; bool F(int x) { if(x==2) return 1; if(x<=1) return 0; if(x%2==0) return 0; for(int i=2; i*i<=x; i++) if(x%i==0) return 0; return 1; } void bfs() { queue<int>Q; Q.push(x); while(!Q.empty()) { int head=Q.front(); Q.pop(); int tmp=head; tot=0; while(tmp) dig[tot++]=tmp%10,tmp=tmp/10; int a=dig[3],b=dig[2],c=dig[1],d=dig[0]; int e=a*1000+b*100+c*10+d; if(e==y) break; for(int i=1; i<=9; i++) { int num=i*1000+b*100+c*10+d; if(f[num]&&m[e]+1<m[num]) { m[num]=m[e]+1; Q.push(num); } } for(int i=0; i<=9; i++) { int num=a*1000+i*100+c*10+d; if(f[num]&&m[e]+1<m[num]) { m[num]=m[e]+1; Q.push(num); } } for(int i=0; i<=9; i++) { int num=a*1000+b*100+i*10+d; if(f[num]&&m[e]+1<m[num]) { m[num]=m[e]+1; Q.push(num); } } for(int i=1; i<=9; i=i+2) { int num=a*1000+b*100+c*10+i; if(f[num]&&m[e]+1<m[num]) { m[num]=m[e]+1; Q.push(num); } } } } int main() { memset(f,0,sizeof f); for(int i=1000; i<=9999; i++) if(F(i)) f[i]=1; scanf("%d",&T); while(T--) { for(int i=1000; i<=9999; i++) m[i]=INF; scanf("%d%d",&x,&y); m[x]=0; bfs(); if(m[y]==INF) printf("Impossible\n"); else printf("%d\n",m[y]); } return 0; }