#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#include <stdlib.h>
#include <stdio.h>
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define l(x) x<<1
#define r(x) x<<1|1
#define ms(a,b) memset(a,b,sizeof(a))
//#define ms(a,b,c,d) memset(a,b,c*sizeof(d))
using namespace std;
int prime[11111];
void init() {
for (int i = 3; i < 100; i+=2) {
if (prime[i] == 1) continue;
for (int j = 3; j < 10000; j+=2) {
if (i*j > 10000) break;
prime[i*j] = 1;
}
}
}
struct node {
int x;
int times;
};
int t, n1, n2,vis[11111];
int bfs() {
ms(vis, 0);
queue<node> mq;
node now, temp;
now.x = n1;
now.times = 0;
mq.push(now);
int tn;
while (!mq.empty()) {
now = mq.front();
mq.pop();
if (now.x == n2) return now.times;
for (int i = 1; i < 10; i += 2) {
tn = i - (now.x % 10);
if (tn == 0) continue;
temp.x = now.x + tn;
if (prime[temp.x] == 0 && vis[temp.x] == 0) {
vis[temp.x] = 1;
temp.times = now.times + 1;
mq.push(temp);
}
}
for (int i = 0; i < 10; i++) {
tn = i - (now.x % 100) / 10 ;
if (tn == 0) continue;
temp.x = now.x + tn * 10;
if (prime[temp.x] == 0 && vis[temp.x] == 0) {
vis[temp.x] = 1;
temp.times = now.times + 1;
mq.push(temp);
}
}
for (int i = 0; i < 10; i++) {
tn = i - (now.x % 1000) / 100;
if (tn == 0) continue;
temp.x = now.x + tn * 100;
if (prime[temp.x] == 0 && vis[temp.x] == 0) {
vis[temp.x] = 1;
temp.times = now.times + 1;
mq.push(temp);
}
}
for (int i = 1; i < 10; i++) {
tn = i - now.x/ 1000;
if (tn == 0) continue;
temp.x = now.x + tn * 1000;
if (prime[temp.x] == 0 && vis[temp.x] == 0) {
vis[temp.x] = 1;
temp.times = now.times + 1;
mq.push(temp);
}
}
}
return -1;
}
int main() {
ms(prime, 0);
init();
cin >> t;
while (t--) {
cin >> n1 >> n2;
cout << bfs() << endl;
}
return 0;
}
poj 3126 (素数筛)
最新推荐文章于 2020-12-09 10:16:52 发布