发布于 

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//printf("!%d %d\n",v,dist[v]);

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}
}

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 [@Songer](https://blog.songer.xyz/) 创建,使用 Stellar 作为主题。