BFS+剪枝
#include <stdio.h> #include <memory.h> int prime[10000]; int st,fin; void Prime() { int i,j; for(i=2;i<10000;i++) { if(!prime[i]) { for( j=i+i;j<10000;j+=i) { prime[j]=1; } } } } int getvalue(int a[]) { int m=0; for(int i=3;i>=0;i--) { m=m*10+a[i]; } return m; } int bfs(int st,int fin) { int visit[10000]={0}; int q[10000]; int dis[10000]={0}; int font=0; int rear=0; q[rear++]=st; dis[font]=0; while(font<rear) { int w=q[font]; int m=w; if(w==fin) return dis[w]; int num[4]; int i; for(i=0;i<4;i++) { num[i]=w%10; w=w/10; } for(i=0;i<4;i++) { int j; if(i==3) j=1; else j=0; int a=num[i]; for(;j<=9;j++) { if(j!=a){ num[i]=j; int tem=getvalue(num); if(!prime[tem]&&!visit[tem]) { dis[tem]=dis[m ]+1; visit[tem]=1; q[rear++]=tem; } } num[i]=a; } } font++; } } int main() { memset(prime,0,sizeof(prime)); Prime(); int N; scanf("%d",&N); while(N--) { scanf("%d %d",&st,&fin); printf("%d\n",bfs(st,fin)); } return 0; }