题目链接:http://poj.org/problem?id=3126
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int maxn=500009; const int INF=0x3f3f3f3f; const int mod=2009; int a, b; int cnt[maxn], vis[maxn]; bool Isprime(int m) { int k=sqrt(m); for(int i=2; i<=k; i++) { if(m%i==0) return false; } return true; } int bfs() { queue<int >Q; cnt[a]=0; vis[a]=1; Q.push(a); while(Q.size()) { int t=Q.front(); Q.pop(); for(int i=0; i<=9; i++) { int t1=t/10*10+i; if(Isprime(t1)&&!vis[t1]) { cnt[t1]=cnt[t]+1; vis[t1]=1; Q.push(t1); } int t2=t/100*100+i*10+t%10; if(Isprime(t2)&&!vis[t2]) { cnt[t2]=cnt[t]+1; vis[t2]=1; Q.push(t2); } int t3=t/1000*1000+i*100+t%100; if(Isprime(t3)&&!vis[t3]) { cnt[t3]=cnt[t]+1; vis[t3]=1; Q.push(t3); } if(i) { int t4=i*1000+t%1000; if(Isprime(t4)&&!vis[t4]) { cnt[t4]=cnt[t]+1; vis[t4]=1; Q.push(t4); } } if(vis[b]) return cnt[b]; } } return 0; } int main() { int T; scanf("%d", &T); while(T--) { memset(cnt, 0, sizeof(cnt)); memset(vis, 0, sizeof(vis)); scanf("%d %d", &a, &b); int ans=bfs(); printf("%d ", ans); } return 0; }