POJ 3126 - Prime Path - [线性筛+BFS]
题目链接: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]的更多相关文章
- POJ - 3126 Prime Path 素数筛选+BFS
Prime Path The ministers of the cabinet were quite upset by the message from the Chief of Security s ...
- POJ 3126 Prime Path 素数筛,bfs
题目: http://poj.org/problem?id=3126 困得不行了,没想到敲完一遍直接就A了,16ms,debug环节都没进行.人品啊. #include <stdio.h> ...
- POJ 3126 Prime Path (素数+BFS)
题意:给两个四位素数a和b,求从a变换到b的最少次数,每次变换只能变换一个数字并且变换的过程必须也是素数. 思路:先打表求出四位长度的所有素数,然后利用BFS求解.从a状态入队,然后从个位往千位的顺序 ...
- BFS POJ 3126 Prime Path
题目传送门 /* 题意:从一个数到另外一个数,每次改变一个数字,且每次是素数 BFS:先预处理1000到9999的素数,简单BFS一下.我没输出Impossible都AC,数据有点弱 */ /**** ...
- 双向广搜 POJ 3126 Prime Path
POJ 3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16204 Accepted ...
- POJ 3126 Prime Path(素数路径)
POJ 3126 Prime Path(素数路径) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 The minister ...
- poj 3126 Prime Path bfs
题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- POJ 3126 Prime Path (bfs+欧拉线性素数筛)
Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...
- POJ - 3126 - Prime Path(BFS)
Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数 ...
随机推荐
- 海康威视(iOS集成)
一.注意事项 1.在开发海康威视的SimpleDemo时,最好使用真机,因为海康提供的5个库不支持模拟的i386架构. 2.在XCode9.3版本上运行SimpleDemo时,对.mm文件进行编辑时, ...
- 2012年NOIP普及组 摆花
题目描述 Description 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种 ...
- VS code配置go语言开发环境之自定义快捷键及其对应操作
VS code 配置 自定义快捷键 及其对应操作 由于 vs code 的官方 go 插件不支持像 goland 一样运行当前 go 文件, 只能项目 或者 package 级别地运行, 因此有必 ...
- 【20180409】IT管理之IT十二条令
团队越来越大,靠人管几乎有力无心,只能靠制度管理了. 前段时间对部门颁布了12条令,效果明显. 特此Mark. 汇报: 三条总结:汇报讲究精简,一个事情最多一句话概括. 一页报告:内容精简,报告一页w ...
- Zabbix 3.4过滤多余的windows网卡监控
在服务器上安装了zabbix 3.4.14之后,zabbix自动发现规则Network interface discovery会自动发现windows服务器上的所有网卡信息,包括一大堆的虚拟网卡等等, ...
- CentOS 7 使用 ACL 设置文件权限
Linux 系统标准的 ugo/rwx 集合并不允许为不同的用户配置不同的权限,所以 ACL 便被引入了进来,为的是为文件和目录定义更加详细的访问权限,而不仅仅是这些特别指定的特定权限. ACL 可 ...
- E-WORK 对接 MTS 系统
E-WORK 目前的 E-WORK 系统主要包含了如下功能: 技能类型的管理 比如说品质检验技能.测试技能(成品测试或半成品测试).组装装配技能(打螺丝.合壳.点胶等).包装技能(封箱. ...
- [转]list的交集,差集,并集
原文地址:https://www.cnblogs.com/changfanchangle/p/8966860.html 工作中用到了list的取差集,发现还是挺好用的.所以记录下. 需求 list的方 ...
- Git分支操作——查看、新建、删除、提交、合并
查看分支 1 查看本地分支 $ git branch 2 查看远程分支 $ git branch -r 创建分支 1 创建本地分支 $ git branch branchName 2 切换 ...
- mongo连接拒绝10061原因
首先检查Mongo是否启动: 启动 再次检查mongo配置文件是否允许其他人访问,默认路由是否加上 .进入mongodb安装目录的bin目录,新增mongodb.conf文件,输入 bind_ip=0 ...