题目链接:http://poj.org/problem?id=3126

题意:

给定两个四位素数 $a,b$,要求把 $a$ 变换到 $b$。变换的过程每次只能改动一个数,要保证每次变换出来的数都是一个没有前导零的四位素数。

要求每步得到的素数都不能重复,求从 $a$ 到 $b$ 最少需要变换多少步;如果无法达到则输出Impossible。

题解:

在BFS之前先用线性筛筛出 $10000$ 以内的素数,方便后面判断是否为素数。

剩下的就是从 $a$ 为起点,入队并标记已经出现过。每次队列非空就取出队头,尝试把这个数的每一位全部改一编,是素数且没出现过的就入队并标记。

循环往复,直到到达 $b$;或者队列空了还没找到。

AC代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii; int st,ed; /************************** 线性筛 - st **************************/
const int MAX=;
int cnt,prime[MAX+];
bool isPrime[MAX+];
void Screen() //欧拉筛法求素数
{
cnt=;
memset(isPrime,,sizeof(isPrime));
isPrime[]=isPrime[]=;
for(int i=;i<=MAX;i++)
{
if(isPrime[i]) prime[cnt++]=i;
for(int j=;j<cnt;j++)
{
if(i*prime[j]>MAX) break;
isPrime[i*prime[j]]=;
if(i%prime[j]==) break;
}
}
}
/************************** 线性筛 - ed **************************/ queue<pii> Q;
bool vis[MAX+];
int bfs()
{
memset(vis,,sizeof(vis));
while(!Q.empty()) Q.pop(); Q.push(make_pair(st,));
vis[st]=;
while(!Q.empty())
{
pii now=Q.front(); Q.pop();
if(now.first==ed) return now.second; for(int i=;i<=;i++) //千位
{
int k=now.first/;
if(k==i) continue;
pii nxt=make_pair(now.first-k*+i*,now.second+);
if(isPrime[nxt.first] && !vis[nxt.first])
{
Q.push(nxt);
vis[nxt.first]=;
}
}
for(int i=;i<=;i++) //百位
{
int k=(now.first%)/;
if(k==i) continue;
pii nxt=make_pair(now.first-k*+i*,now.second+);
if(isPrime[nxt.first] && !vis[nxt.first])
{
Q.push(nxt);
vis[nxt.first]=;
}
}
for(int i=;i<=;i++) //十位
{
int k=(now.first%)/;
if(k==i) continue;
pii nxt=make_pair(now.first-k*+i*,now.second+);
if(isPrime[nxt.first] && !vis[nxt.first])
{
Q.push(nxt);
vis[nxt.first]=;
}
}
for(int i=;i<=;i++) //个位
{
int k=now.first%;
if(k==i) continue;
pii nxt=make_pair(now.first-k+i,now.second+);
if(isPrime[nxt.first] && !vis[nxt.first])
{
Q.push(nxt);
vis[nxt.first]=;
}
}
}
return -;
} int main()
{
Screen();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&st,&ed);
int ans=bfs();
if(ans==-) printf("Impossible\n");
else printf("%d\n",ans);
}
}

POJ 3126 - Prime Path - [线性筛+BFS]的更多相关文章

  1. POJ - 3126 Prime Path 素数筛选+BFS

    Prime Path The ministers of the cabinet were quite upset by the message from the Chief of Security s ...

  2. POJ 3126 Prime Path 素数筛,bfs

    题目: http://poj.org/problem?id=3126 困得不行了,没想到敲完一遍直接就A了,16ms,debug环节都没进行.人品啊. #include <stdio.h> ...

  3. POJ 3126 Prime Path (素数+BFS)

    题意:给两个四位素数a和b,求从a变换到b的最少次数,每次变换只能变换一个数字并且变换的过程必须也是素数. 思路:先打表求出四位长度的所有素数,然后利用BFS求解.从a状态入队,然后从个位往千位的顺序 ...

  4. BFS POJ 3126 Prime Path

    题目传送门 /* 题意:从一个数到另外一个数,每次改变一个数字,且每次是素数 BFS:先预处理1000到9999的素数,简单BFS一下.我没输出Impossible都AC,数据有点弱 */ /**** ...

  5. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  6. POJ 3126 Prime Path(素数路径)

    POJ 3126 Prime Path(素数路径) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 The minister ...

  7. poj 3126 Prime Path bfs

    题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  8. POJ 3126 Prime Path (bfs+欧拉线性素数筛)

    Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...

  9. POJ - 3126 - Prime Path(BFS)

    Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数 ...

随机推荐

  1. (20170207)开源第三方学习之JSONModel

    1:仓库地址:https://github.com/jsonmodel/jsonmodel   主要作用是把JSON字符串转成Model实体,也可以把实体转化成JSON字符串:还包含一些转字典的内容: ...

  2. SpringBoot2.0集成FastDFS

    SpringBoot2.0集成FastDFS 前两篇整体上介绍了通过 Nginx 和 FastDFS 的整合来实现文件服务器.但是,在实际开发中对图片或文件的操作都是通过应用程序来完成的,因此,本篇将 ...

  3. C# 调用线程并行上下文穿透-ILogicalThreadAffinative+CallContext

    na mespace System.Runtime.Remoting.Messaging { /// <summary>Provides a set of properties that ...

  4. 【Linux】常见公共DNS地址

    如果您是程序员.系统管理员或任何类型的 IT 工作者,那么您可能有自己最喜欢的用于故障排除的 IP 地址.而且你可能已经用了好几年了. 这些 ip 可用于: ping 测试连接 使用 dig 或 ns ...

  5. VMWare 虚机迁移后Linux系统网卡启动问题

    重新安装VMWare或拷贝虚机文件后有时网卡会无法工作,主要是因为网卡的Mac地址改变了,如果系统中的网卡配置信息中有Mac的信息,则虚机的系统的网卡可能无法正常工作. 如果出现上述问题,解决办法如下 ...

  6. 分析轮子(一)-ArrayList.java

    前言:之前也看过一些JDK源码,不过没有留下痕迹,经久年月就淡忘了,现在的时机也差不多了,想再看一次,并且记录下来自己的感想,于是从自己使用最多最熟悉的地方开始!并且看的过程中,我希望自己思考一下如下 ...

  7. 构建自己的 Smart Life 私有云(一)-> 破解涂鸦智能插座

    博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml 原文链接:https://blog.wang ...

  8. vim几种常用的插入模式

    我们来看一下cw这个命令,它是从光标处替换到后一个单词的结尾.比如说我的光标如图: 我的namespace写错了,后面的都对,就可以用cw命令,

  9. 飞鹅云打印 API_C#

    飞鹅云打印: 提交订单支付成功后台自动打印,实现无人销售,自动打印,后台统计打印记录功能:   有自带WIFY:连接到wify就可以打印小票: 有自动SIM卡:第1年免流量费,第2年30一年     ...

  10. 【iCore4 双核心板_FPGA】例程十七:基于FIFO的ARM+FPGA数据存取实验

    实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int fsmc_read_data; ; ]; ]; char *p; /* ...