Prime Path
Prime Path
POJ 3126
这道题也可以算是到水题吧。搜索加上求素数,这里用的是线性筛。
题目来源: vjudge | POJ
分析
题目要求很简单,给定一个起点和终点,要求用最短的步数到达。每改变一个数算作一步,并且在改变后要求仍然为素数。所以先算出所有素数,然后进行暴力BFS即可。
代码
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 76 77 78
| #include <iostream> #include <queue> #include <cstring>
using namespace std;
bool prime[10100]; int dist[10100]; int n;
void Prime() { truefor (int i = 1; i<=10000; i++) truetrueprime[i] = true;
trueprime[1] = false; trueprime[2] = prime[3] = true; truefor (int i = 2; i<=100; i++) truetrueif (prime[i]) truetrue{ truetruetrueint j = i*i; truetruetruewhile (j<=10000) truetruetrue{ truetruetruetrueprime[j] = false; truetruetruetruej += i; truetruetrue} truetrue} truereturn; }
queue<int> q; int main() { truePrime();
truecin >> n; truefor (int k = 1; k<=n; k++) true{ truetruememset(dist,0,sizeof(dist));
truetrueint x,y; truetruecin >> x >> y; truetrue truetrueq = queue<int>(); truetruedist[x] = 1; truetrueq.push(x); truetruewhile (!q.empty()) truetrue{ truetruetrueint v = q.front(); q.pop(); truetruetrue
truetruetrueif (v==y) truetruetruetruebreak;
truetruetrueint t = 1; truetruetruefor (int i = 0; i<4; i++) truetruetrue{ truetruetruetruefor (int j = 0; j<=9; j++) truetruetruetrue{ truetruetruetruetrueint z; truetruetruetruetrueif (t==1) truetruetruetruetruetruez = v/(t*10)*(t*10) + t*j; truetruetruetruetrueelse z = v/(t*10)*(t*10) + t*j + v%t; truetruetruetruetrue truetruetruetruetrueif (dist[z]==0 && prime[z] && z>=1000) truetruetruetruetrue{ truetruetruetruetruetruedist[z] = dist[v] + 1; truetruetruetruetruetrueq.push(z); truetruetruetruetrue} truetruetruetrue}
truetruetruetruet *= 10; truetruetrue} truetrue} true truetruecout << dist[y]-1 << endl; true} }
|