方法:bfs;看到最优的,bfs还是容易想到的方法 #include<iostream> using namespace std; #include<cstdio> int queue[10000]; int visited[10000]; int prm[10000]; int dir[4]={1,10,100,1000}; void bfs(int v) { int i,j,k,t,item,next_v; int front=-1,rear=0; queue[0]=v; visited[v]=0; while(front<rear) { item=queue[++front]; for(i=0;i<4;i++) { t=item; for(k=0;k<i;k++) t/=10; if(i==3) j=1; else j=0; for(;j<10;j++) { next_v=item-dir[i]*(t%10)+dir[i]*j; if(!prm[next_v]&&visited[next_v]==-1) { queue[++rear]=next_v; visited[next_v]=visited[item]+1; } } } } } int main() { int ca,i,j,m,n; memset(prm,0,sizeof(prm)); for(i=2;i<5000;i++) if(!prm[i]) for(j=i+i;j<10000;j+=i) prm[j]=1; scanf("%d",&ca); while(ca--) { for(i=0;i<10000;i++) visited[i]=-1; scanf("%d%d",&m,&n); bfs(m); if(visited[n]==-1) printf("Impossible/n"); else printf("%d/n",visited[n]); } return 0; }