poj 3126
基本上可以说是做的第一道bfs题,稍微有点感觉了
//============================================================================ // Name : 3126.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; int ans[10000]; queue <int> q; bool visit[10000], prime[10000]; int N, a, b; int bfs(int m, int n){ while(!q.empty()) q.pop(); memset(ans, 0, sizeof(ans)); q.push(m); visit[m] = true; int p; if(visit[n]) return ans[n]; while(!q.empty()){ p = q.front(); q.pop(); for(int i = 0;i <= 9;i++){ if(prime[p/10*10 + i]&&!visit[p/10*10 + i]){ q.push(p/10*10 + i); ans[p/10*10 + i] = ans[p]+1; visit[p/10*10 + i] = true; } if(prime[p/100*100+p%10+i*10]&&!visit[p/100*100+p%10+i*10]){ q.push(p/100*100+p%10+i*10); ans[p/100*100+p%10+i*10] = ans[p]+1; visit[p/100*100+p%10+i*10] = true; } if(prime[p/1000*1000+p%100+i*100]&&!visit[p/1000*1000+p%100+i*100]){ q.push(p/1000*1000+p%100+i*100); ans[p/1000*1000+p%100+i*100] = ans[p]+1;; visit[p/1000*1000+p%100+i*100] = true; } if(i!=0&&prime[p%1000+i*1000]&&!visit[p%1000+i*1000]){ q.push(p%1000+i*1000); ans[p%1000+i*1000] = ans[p]+1; visit[p%1000+i*1000] = true; } } if(visit[n]){ return ans[n]; } } } int main() { freopen("a.txt", "r", stdin); memset(prime, true, sizeof(prime)); prime[1] = false; for(int i = 2;i <= 9999/2;i++){ if(prime[i]){ for(int j = i<<1;j <= 9999;j+=i){ prime[j] = false; } } } scanf("%d", &N); while(N--){ scanf("%d%d",&a, &b); memset(visit, false, sizeof(visit)); printf("%d\n", bfs(a, b)); } return 0; }