POJ - 3126 Prime Path 素数筛选+BFS
Prime Path
— It is a matter of security to change such things every now and then, to keep the enemy in the dark.
— But look, I have chosen my number 1033 for good reasons. I am the Prime minister, you know!
— I know, so therefore your new number 8179 is also a prime. You will just have to paste four new digits over the four old ones on your office door.
— No, it’s not that simple. Suppose that I change the first digit to an 8, then the number will read 8033 which is not a prime!
— I see, being the prime minister you cannot stand having a non-prime number on your door even for a few seconds.
— Correct! So I must invent a scheme for going from 1033 to 8179 by a path of prime numbers where only one digit is changed from one prime to the next prime.
Now, the minister of finance, who had been eavesdropping, intervened.
— No unnecessary expenditure, please! I happen to know that the price of a digit is one pound.
— Hmm, in that case I need a computer program to minimize the cost. You don't know some very cheap software gurus, do you?
— In fact, I do. You see, there is this programming contest going on... Help the prime minister to find the cheapest prime path between any two given four-digit primes! The first digit must be nonzero, of course. Here is a solution in the case above.
1033
1733
3733
3739
3779
8779
8179
The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.
Input
Output
Sample Input
3
1033 8179
1373 8017
1033 1033
Sample Output
6
7
0 题意:题目较长,实际就是给你两个四位素数,让你每次只能更改第一个素数的其中一位,更改后要求也是素数且位数不变,问你至少需要更改几次才能变成第二个素数。无解输出Impossible。
思路:本题涉及到素数,每次更改后均需要判断,所以避免重复计算,在程序开始先用筛法把每个四位数的素数性提前存到数组prime。之后分别更改一位数值(第一位不可能是0,最后一位只能是奇数),记录下变更次数即可。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; int prime[],bo[];
struct Node{
int x,s;
}node; int main()
{
int t,a,b,f,i,j;
prime[]=;
for(i=;i<=;i++){
if(!prime[i]){
for(j=;i*j<=;j++){
prime[i*j]=; //素数筛选
}
}
}
scanf("%d",&t);
while(t--){
queue<Node> q;
memset(bo,,sizeof(bo));
scanf("%d%d",&a,&b);
if(a==b) printf("0\n");
else{
bo[a]=;
node.x=a;
node.s=;
q.push(node);
f=;
while(q.size()){
int tx=q.front().x;
for(i=;i<=;i++){
if(i!=tx%&&!prime[tx-tx%+i]&&bo[tx-tx%+i]==){
if(tx-tx%+i==b){
f=q.front().s+;
break;
}
bo[tx-tx%+i]=;
node.x=tx-tx%+i;
node.s=q.front().s+;
q.push(node);
}
if(i!=tx/%&&!prime[tx-tx/%*+i*]&&bo[tx-tx/%*+i*]==){
if(tx-tx/%*+i*==b){
f=q.front().s+;
break;
}
bo[tx-tx/%*+i*]=;
node.x=tx-tx/%*+i*;
node.s=q.front().s+;
q.push(node);
}
if(i!=tx/%&&!prime[tx-tx/%*+i*]&&bo[tx-tx/%*+i*]==){
if(tx-tx/%*+i*==b){
f=q.front().s+;
break;
}
bo[tx-tx/%*+i*]=;
node.x=tx-tx/%*+i*;
node.s=q.front().s+;
q.push(node);
}
if(i!=&&i!=tx/&&!prime[tx-tx/*+i*]&&bo[tx-tx/*+i*]==){
if(tx-tx/*+i*==b){
f=q.front().s+;
break;
}
bo[tx-tx/*+i*]=;
node.x=tx-tx/*+i*;
node.s=q.front().s+;
q.push(node);
}
}
if(f!=) break;
q.pop();
}
if(f==) printf("Impossible\n");
else printf("%d\n",f);
}
}
return ;
}
POJ - 3126 Prime Path 素数筛选+BFS的更多相关文章
- Prime Path(素数筛选+bfs)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9519 Accepted: 5458 Description The m ...
- POJ 3126 Prime Path 素数筛,bfs
题目: http://poj.org/problem?id=3126 困得不行了,没想到敲完一遍直接就A了,16ms,debug环节都没进行.人品啊. #include <stdio.h> ...
- POJ 3126 - Prime Path - [线性筛+BFS]
题目链接:http://poj.org/problem?id=3126 题意: 给定两个四位素数 $a,b$,要求把 $a$ 变换到 $b$.变换的过程每次只能改动一个数,要保证每次变换出来的数都是一 ...
- POJ 3126 Prime Path(素数路径)
POJ 3126 Prime Path(素数路径) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 The minister ...
- 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 bfs
题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- POJ 3126 Prime Path【从一个素数变为另一个素数的最少步数/BFS】
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26475 Accepted: 14555 Descript ...
- POJ 3126 Prime Path (bfs+欧拉线性素数筛)
Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...
随机推荐
- cubietruck制作刷新lubuntu-kernel
一:安装交叉编译工具链以及相应的工具(系统最好是ubutnu-64位-server) sudo apt-get install g++ sudo apt-get install libncurses5 ...
- CXF实战之自己定义拦截器(五)
CXF已经内置了一些拦截器,这些拦截器大部分默认加入到拦截器链中,有些拦截器也能够手动加入,如手动加入CXF提供的日志拦截器.也能够自己定义拦截器.CXF中实现自己定义拦截器非常easy.仅仅要继承A ...
- RTSP/RTMP/HLS/HTTP流媒体播放器EasyPlayer
EasyPlayer播放器系列项目 EasyPlayer是由EasyDarwin开源团队开发和维护的一个流媒体播放器系列项目,随着多年不断的发展和迭代,不断基于成功的实践经验,发展出包括有: Easy ...
- difference between http get and post
1 用get的地方 在浏览器中输入url直接访问资源时,用get.get是通过url传参的. 2 用post的地方 2.1 url长度超限时 post是将参数放在http body中的,因此对参数的长 ...
- cocos2d-js v3事件管理器
总概: 1.时间监听器(cc.EventListener)封装用户的事件处理逻辑. 2.事件管理器(cc.eventManager)管理用户注册的事件监听器. 3.事件对象(cc.Event)包含事件 ...
- gradle中的 settings.gradle
gradle 默认只执行当前目录下的build.gradle 脚本,而我们的项目通常是有多个模块依赖的,这时需要我们对多个目录同时编译,那就需要我们创建一个settings.gradle 文件 如果 ...
- 转载-jmeter进阶功能
在这此对新版本jmeter的学习+温习的过程,发现了一些以前不知道的功能,所以,整理出来与大分享.本文内容如下. 如何使用英文界面的jmeter 如何使用镜像服务器 Jmeter分布式测试 启动Deb ...
- SpringMVC+Spring+MyBatis配置
今天配置项目时遇到一个问题,tomcat启动没有报错,但是访问页面的时总是报404,后台打印的日志是: 8080-exec-1] WARN springframework.web.servlet.Pa ...
- sendevent是使用
按下: sendevent /dev/input/event4 1 254 1 sendevent /dev/input/event4 0 0 0 松开: sendevent /dev/input/e ...
- git删除某次提交(某个commit)的方法【转】
本文转载自:https://www.36nu.com/post/275 git删除某次提交(某个commit)的方法 疯狂的兔子 发表于 4个月前 阅读 536 收藏 0 推荐 0 评论 0 推荐收藏 ...