链接:https://vjudge.net/problem/POJ-3126
题意:
给两个四位数的素数a,b。每次可以改变a的一个值使其成为一个新的四位数素数。
求从a-b的最小操作次数
思路:
最大10000的素数打表,BFS即可。
代码:
#include <iostream> #include <memory.h> #include <queue> using namespace std; typedef long long LL; const int MAXN = 10000; int Primes[MAXN]; int vis[MAXN]; int vis_Primes[MAXN]; int Max; struct Node { int _value; int _step; Node(int value,int step) { _value = value; _step = step; } }; void init() { //168 Primes[168-MAXN] > 999 int pos = 0; memset(vis,0,sizeof(vis)); for (int i = 2;i<MAXN;i++) { if (vis[i] == 0) Primes[pos++] = i; for (int j = 0;j < pos&&i*Primes[j] < MAXN;j++) { vis[i*Primes[j]] = 1; if (i%Primes[j] == 0) break; } } Max = pos; } int main() { init(); int t,a,b; scanf("%d",&t); while (t--) { memset(vis_Primes,0,sizeof(vis_Primes)); scanf("%d%d",&a,&b); queue<Node> que; que.push(Node(a,0)); vis_Primes[a] = 1; while (!que.empty()) { int now_value = que.front()._value; int now_step = que.front()._step; if (now_value == b) break; for (int i = 168;i<Max;i++) { int flag = 0; int nex = Primes[i]; while (now_value) { if (now_value%10 != nex%10) flag++; now_value/=10; nex/=10; } if (flag == 1&&vis_Primes[Primes[i]] == 0) { vis_Primes[Primes[i]] = 1; que.push(Node(Primes[i],now_step+1)); } now_value = que.front()._value; } que.pop(); } printf("%d ",que.front()._step); } return 0; } /* 1 1033 8179 */