1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include <queue> #include <iostream> #include <string.h> #include <math.h>
using namespace std;
const int maxn = 1e4; bool prime[maxn]; bool vis[maxn]; int a,b; int ans[maxn]; int w[4] = {1000,100,10,1};
void find_prime() { for (int i=2; i<maxn; i++) prime[i] = 1;
for (int i=2; i<=sqrt((double)maxn); i++) { for (int j=i*i; j<maxn; j += i) { prime[j] = 0; } } } void bfs() { memset(vis,0,sizeof vis); memset(ans,0,sizeof ans); queue<int> que;
que.push(a); vis[a] = 1;
while ( !que.empty() ) { int cur = que.front(); que.pop();
if (cur == b) return ;
for (int i=0; i<4; i++) { int x = cur; x = x / w[i]; x = x % 10; int num = cur - x * w[i]; for (int j=0; j<=9; j++) { if (i == 0 && j == 0) continue; int sum = j * w[i] + num; if (!vis[sum] && prime[sum]) { vis[sum] = 1; ans[sum] = ans[cur] + 1; que.push(sum); } } }
} return ; } int main() {
find_prime(); int times; cin >> times; while (times--) { cin >> a >> b; bfs(); cout << ans[b] << endl; } return 0; }
|