题目链接: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]的更多相关文章

  1. POJ - 3126 Prime Path 素数筛选+BFS

    Prime Path The ministers of the cabinet were quite upset by the message from the Chief of Security s ...

  2. POJ 3126 Prime Path 素数筛,bfs

    题目: http://poj.org/problem?id=3126 困得不行了,没想到敲完一遍直接就A了,16ms,debug环节都没进行.人品啊. #include <stdio.h> ...

  3. POJ 3126 Prime Path (素数+BFS)

    题意:给两个四位素数a和b,求从a变换到b的最少次数,每次变换只能变换一个数字并且变换的过程必须也是素数. 思路:先打表求出四位长度的所有素数,然后利用BFS求解.从a状态入队,然后从个位往千位的顺序 ...

  4. BFS POJ 3126 Prime Path

    题目传送门 /* 题意:从一个数到另外一个数,每次改变一个数字,且每次是素数 BFS:先预处理1000到9999的素数,简单BFS一下.我没输出Impossible都AC,数据有点弱 */ /**** ...

  5. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  6. POJ 3126 Prime Path(素数路径)

    POJ 3126 Prime Path(素数路径) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 The minister ...

  7. poj 3126 Prime Path bfs

    题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  8. POJ 3126 Prime Path (bfs+欧拉线性素数筛)

    Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...

  9. POJ - 3126 - Prime Path(BFS)

    Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数 ...

随机推荐

  1. R语言学习-set.seed()

    今天查了一下R语言中set.seed(),该命令的作用是设定生成随机数的种子,种子是为了让结果具有重复性.如果不设定种子,生成的随机数无法重现. > x<-rnorm(10) #随机生成1 ...

  2. 【C++】C++中的分离式编译

    在C++中随着程序越来越复杂,我们希望把程序的各个部分分别储存在不同的文件中.C++支持的分离式编译(separate compilation)允许我们把程序分割到几个文件中去,每个文件独立编译. 头 ...

  3. go 源码学习之---Tail 源码分析

    已经有两个月没有写博客了,也有好几个月没有看go相关的内容了,由于工作原因最近在做java以及大数据相关的内容,导致最近工作较忙,博客停止了更新,正好想捡起之前go的东西,所以找了一个源码学习 这个也 ...

  4. 每天学习一个Linux命令-目录

    在工作中总会零零散散使用到各种Linux命令,从今天开始详细的学习一下linux常用命令,坚持每天一个命令,学习的主要参考资料为: 1.竹子-博客(https://www.cnblogs.com/pe ...

  5. [HDFS Manual] CH3 HDFS Commands Guide

    HDFS Commands Guide HDFS Commands Guide 3.1概述 3.2 用户命令 3.2.1 classpath 3.2.2 dfs 3.2.3 envvars 3.2.4 ...

  6. xml序列化与反序列化工具

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  7. Airtest iOS测试环境部署

    [本文出自天外归云的博客园] 简介 这个Airtest IDE是通过iOS-Tagent来操作iPhone的,你可以在Airtest IDE里录制脚本来实现自动化操作iPhone 前提 1. 得有个i ...

  8. NO.1 hadoop简介

    第一次接触这个时候在网上查了很多讲解,以下很多只是来自网络. 1.Hadoop (1)Hadoop简介    Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层 ...

  9. 【javascript】定时器组件

    'use strict'; module.exports = function() { this.timer = {}; this.config = {}; // 初始化参数 this.init = ...

  10. IDEA设置换行符为Unix编码格式,设置编码统一为UTF-8,自动生成serialVersionUID

    设置换行符为Unix编码格式 设置编码统一为UTF-8 自动生成serialVersionUID.勾选"Serializable class without serialVersionUID ...