Prime Path |
---|
题意: 要求把一个四位数的素数,每次变化其中一个数字,并且得到的必须也是素数,问至少要几步操作才能得到目标素数。
题解: 还算比较简单的BFS吧,只要再加个限制条件,要求变化得到的数也要是素数。然后就是我一直卡着没注意到的点,我是通过每位上加上一个数来变化的,但是我一开始没注意范围,比如说一个数8800+300,我本意是想改变百位上的数字,但是影响到了千位,一开始因为这个原因,卡了很久。然后是输出,注意其实数和目标数相同的话要输出0,得不到目标数的话输出Impossible。
#include <algorithm>
#include <cmath>
#include <iostream>
#include <queue>
using namespace std;
const int num = 10010;
int t, n, m;
int vis[num];
int flag[num];
struct node {
int id, step;
};
void isprime() {
for (int i = 2; i < num; i++) {
if (flag[i]) continue;
for (int j = 2 * i; j < num; j += i)
flag[j] = 1;
}
}
int jud(int next) {
if (next < 1000 || next > 9999 || vis[next] || flag[next]) return 0;
return 1;
}
void BFS() {
queue<node> q;
node u;
u.id = n, u.step = 0;
vis[n] = 1;
q.push(u);
while (!q.empty()) {
node front, next;
front = q.front(); q.pop();
if (front.id == m) {
printf("%d\n", next.step);
return;
}
int fro = front.id, add = 1;
for (int i = 0; i < 4; i++) {
if (i) fro /= 10, add *= 10;
for (int j = -9; j < 10; j++) {
if (fro % 10 + j < 0 || fro % 10 + j > 9 || j == 0)
continue;
next.id = front.id + add * j;
if (jud(next.id)) {
next.step = front.step + 1;
vis[next.id] = 1;
if (next.id == m) {
printf("%d\n", next.step);
return;
}
q.push(next);
}
}
}
}
printf("Impossible\n");
}
int main() {
scanf("%d", &t);
isprime();
while (t--) {
for (int i = 1000; i < num; i++)
vis[i] = 0;
scanf("%d%d", &n, &m);
BFS();
}
return 0;
}