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 必须是素数.求变换次数 ...
随机推荐
- 尝试IRC & freenode
古老的 IRC,一直都没有试过,今天就尝试了一下,专注于聊天的东西啊. 把初用的过程记录下来 先找了一下客户端,命令行版本的我试了一下 weechat(和微信就差一个字母),图形的用了 TimeCha ...
- github和gitlab并存
原先在自己电脑中配置github的全局变量,只用它来玩github和码云的项目.现在用自己的电脑开发公司项目,公司项目使用的是gitlab,结果拉取代码时还需要手动输入用户名和密码,这还能忍受几次,但 ...
- VNC Viewer 设置屏幕分辨率
1.第一种方法:使用geometry参数进行调整 vncserver -geometry 1280x1024即可,之后通过window下vnc连接后的ubuntu分辨率即为1280x1024了,注意这 ...
- 偏离中轴的cos半球积分问题
问题: 如果N与n重合,则就是普通的cos半球积分,地球人都知道结果是pi. 对于N与n不重合的一般情况,稍微麻烦一些. 解法1(同济高数课本的方法,参考同济高数第六版第二册“曲面积分”一章): 解法 ...
- mac上配置使用virtualenv
1.安装virtualenv $ sudo pip install virtualenv 2.安装virtualenvwrapper $ sudo easy_install virtualenvwra ...
- 【GMT43智能液晶模块】例程十:DMA实验——存储器到存储器的传输
实验原理: DMA(直接存储器访问)传输不需要占用CPU,可以在存储器至存储器实现高速的数据 传输.本实验采用DMA2控制器的数据流0,选用通道0进行数据传输.通过液晶控制传输 和结果显示. 示例截图 ...
- C#字符串、字节数组和内存流间的相互转换
定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串=>比特数组 (1)byte[] bt=System.Text.Encoding.Default.GetBytes(&q ...
- 大数据架构:搭建CDH5.5.1分布式集群环境
yum install -y ntp gcc make lrzsz wget vim sysstat.x86_64 xinetd screen expect rsync bind-utils ioto ...
- SunRain
系统学习了半年java 开始业务攻坚 学习占缓 拼凑一个前后端分离的小项目 慢慢优化 https://gitee.com/fleam/SunRain.git
- DOTween-Ease缓动函数
Ease.InQuad 不知道Quad代表什么意思 Ease.InQuart 有1/4的时间是没有缓动. Ease.InQuint, 是1/5时间没有缓动. Ease.InExpo 一直很平缓, ...