【代码超详解】POJ 3126 Prime Path(质数打表 + BFS)

一、题目描述

第一行输入 n,表示样例个数。
接下来n行每行两个数 s 和 t,单个空格分隔,表示两个质数。
对每一个样例,输出从 s 变换到 t 需要的最小花费。
s 和 t 保证为 1000 到 9999 之间的质数。每次变换只能变换一位,花费 1 英镑。
提示:已经换下来的数字不能再放上去。例如从 1033 变换至 8179:

1033
1733
3733
3739
3779
8779
8179

第二次变换中换下的 1(变成了 3)不能在最后一步中直接放上去,必须要一个额外的 1,这个花费不能省。
如果不能变换,输出:

Impossible

样例:
输入

3
1033 8179
1373 8017
1033 1033

输出

6
7
0

二、算法分析说明与代码编写指导

先套个质数打表的板子,获得 10000 以内的全部质数:

//版本一:
unsigned prime[6542] = {
    2,3 }, _PTy, MaxPrime;
inline void genprime(const size_t& _Size) {
   
	decltype(_PTy) a = 4, t; bool flag;
	for (size_t i = 2; i < _Size;) {
   
		t = sqrt(a), flag = true;
		for (size_t j = 0; prime[j] <= t; ++j)
			if (a % prime[j] == 0) {
    flag = false; break; }
		if (flag) {
    prime[i] = a, ++i; }
		++a;
	}
	MaxPrime = prime[_Size - 1];
}
inline bool isprime(const decltype(_PTy)& x) {
   
	if (x <= MaxPrime)return binary_search(prime, prime_end, x);
	else {
   
		decltype(_PTy) t = min((decltype(_PTy))sqrt(x), MaxPrime);
		for (size_t j = 0; prime
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值