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 必须是素数.求变换次数 ...
随机推荐
- 一步步教你轻松学KNN模型算法
一步步教你轻松学KNN模型算法( 白宁超 2018年7月24日08:52:16 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用.本文通过一个模拟的实际案例进行讲解. ...
- vs2017 打开附带的localdb v13
查看自己本机装了哪些版本的localdb 打开数据库资源管理器 添加数据库连接 选择要连接的localdb版本,这里选择的是v13版本 添加数据库 新建一个test数据库 ...
- Device does not seem to be present [常见错误解决]
一.故障现象: [root@c1node01 ~]# service network restart Shutting down loopback insterface: ...
- Winscp使用sudo user登录
为了安全期间, 一般设置了禁止root用户ssh登录.使用普通用户登录后再sudo获取操作权限. 可为了文件传文件使用winscp,如何使用sudo登录以获取权限传文件呢 先在服务端设置sudo帐号权 ...
- Centos7.4修改主机名HostName颜色及格式
一.打开 .bashrc文件 1.位置:~(cd ~)目录下 2.cat .bashrc 原文件内容如下: # .bashrc # User specific aliases and function ...
- 为什么要使用NoSQL
转载自:http://www.infoq.com/cn/news/2011/01/nosql-why [编者按]NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都 ...
- SpringMvc的Url映射和传参案例(转)
Springmvc的基本使用,包括url映射.参数映射.页面跳转.ajax和文件上传 以前学习的时候写的代码案例,今天整理笔记的时候找到了,很久没有来园子了,发上来当个在线笔记用吧,免的时间长了又忘了 ...
- [Linux]Linux下signal function传参方式
https://stackoverflow.com/questions/6970224/providing-passing-argument-to-signal-handler This is a r ...
- github控件地址
地址: https://github.com/wasabeef/awesome-android-ui http://www.jcodecraeer.com/plus/list.php?tid=31 h ...
- laravel框架生產vender文件夹
方法一.修改拓展 去php.ini中查看下面三个扩展项是否开启 extension=php_fileinfo.dll extension=php_mbstring.dll extension=php_ ...