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 必须是素数.求变换次数 ...
随机推荐
- PL/SQL学习笔记之日期时间
一:PL/SQL时间相关类型 PL/SQL提供两个和日期时间相关的数据类型: 日期时间(Datetime)数据类型 时间间隔类型 二:日期时间类型 datetime数据类型有: DATE TIMEST ...
- OpenWrt 对外网开放vsftp服务和samba服务
对WAN开放vsFTP OpenWrt默认启动了vsftp服务, 在Luci上没找到配置界面, 但是后台是有这个服务的, 如果在Openwrt的lan下, 可以直接使用FileZilla之类的客户端连 ...
- Python之基础练习代码
代码1: # -*- coding: utf-8 -*- def function(*numbers): sum = 0 for num in numbers: sum = sum + num*num ...
- mongodb配置文件解说(转载)
启动方式 ./bin/mongod -f mongodb.conf 会看到 about to fork child process, waiting until server is ready for ...
- 通过jQuery实时监听表格行数变化
[本文出自天外归云的博客园] 使用bootstrap table组件,当使用过滤器的时候,页面的表格行数发生变化,此时需要统计表格行数.想要监听表格变化,如何做呢? 使用场景:有一个表格里放着许多测试 ...
- SLAM的前世今生
SLAM技术已经蓬勃发展起来,这里综述性地介绍下SLAM的主体知识.SLAM的主体技术不多,难点在于细节.来源是:技术分享.ppt 前世 人类惆怅近千年的问题不是:我是谁,我要做什么,我要去哪里!而是 ...
- 字节输入流:io包中的InputStream为所有字节输入流的父类。
字节输入流:io包中的InputStream为所有字节输入流的父类. Int read();读入一个字节(每次一个): 可先使用new byte[]=数组,调用read(byte[] b) read ...
- ajax json struts JSP传递消息到action返回数据到JSP
ACTION package actions; import com.opensymphony.xwork2.ActionSupport; import net.sf.json.JSONObject; ...
- docker必须要sudo,但是sudo的话,又获得不了环境变量怎么办?
方法1 sudo usermod -a -G docker $USER 方法2 sudo -E docker-compose ... 在sudo后面加上-E
- 使用PHP几种写99乘法表的方式
首先按照规矩,还是先废话一番,对于刚学PHP的新手来讲,用php写九九乘法表无疑是非常经典的一道练习题. 但不要小看这道练习题,它对于逻辑的考验还是相当到位的. 也许有人会觉得,九九乘法表有什么难的, ...