poj 3126 Prime Path

缘起

日常浪费生命 poj 3126 Prime Path

分析

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
给你两个四位数的素数(1000~9999),通过改变其中的一个数,每次只允许改变一位数,而且改变之后的数也必须是个素数,问你最
少通过改变几次变成后一个四位的素数。如果不能改变成后面的四位素数则输出Impossible。

【输入】
多样例, 第一行是样例数. 然后每个样例都是两个四位素数

【输出】
最短路径, 办不到的话, 输出 Impossible

【样例输入】
3
1033 8179
1373 8017
1033 1033

【样例输出】
6
7
0

【限制】
1s

【hint】
1033 -->1733 -->3733 -->3739 -->3779 -->8779 -->8179
所以是6

显然,先使用线性筛将[1000,9999]中的素数全部筛出来. 然后进行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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//#include "stdafx.h"

#include <stdio.h>
//#define LOCAL
#include <string.h>
#include <queue>
using namespace std;

char a[10],b[10]; // a[0]是最高位
int aa,bb; // aa是a对应的整数,bb是b对应的整数
bool isprime[10005]; // isprime[i]为true表示i为素数
bool book[10005]; // 是否访问过了

void sieve() // 筛法
{
memset(isprime, true, sizeof(isprime));
for (int i = 2; i<=9999;i++)
{
if (isprime[i])
{
for (int j = (i<<1); j<=9999; j+=i)
{
isprime[j] = false;
}
}
}
}

struct Node // 宽搜中的节点
{
char *p;
int step;
Node(char *p, int step):p(p),step(step){}
};

int honter(char p[]) // 洪特规则
{
int ans = 0;
for (int i=0; i<4; i++)
{
ans = 10*ans+p[i]-'0';
}
return ans;
}

int bfs()
{
memset(book, 0, sizeof(book));
queue<Node> q;
q.push(Node(a, 0));
book[aa] = true;
while(!q.empty())
{
Node front = q.front();
q.pop();
if (!strcmp(front.p, b))
{
return front.step;
}
for (int i = 0; i<4; i++) // 变化千、百、十、个
{
for (int j = i?0:1,jj; j<=9; j++) // 千位只能从1开始变化
{
char *t = new char[10]; // 注意, 这里不能写char t[10], 不然局部变量地址不变, 就糟糕了
strcpy(t,front.p);
t[i] = '0'+j;
jj = honter(t);
if (!book[jj]&&isprime[jj])
{
book[jj] = true;
q.push(Node(t,front.step+1));
}
}
}
}
return -1;
}

int main()
{
#ifdef LOCAL
freopen("d:\\data.in", "r", stdin);
//freopen("d:\\my.out", "w", stdout);
#endif
int t;
scanf("%d", &t);
sieve(); // 筛出1w以内的所有素数
while(t--)
{
scanf("%s%s", &a, &b);
aa = honter(a), bb = honter(b);
int ans = bfs();
~ans?printf("%d\n", ans):puts("Impossible");
}
return 0;
}

ac情况

20822487 yfsyfs 3126 Accepted 9960K 516MS C++ 1555B 2019-08-31 22:16:38