Prime Path(POJ - 3126)【BFS+筛素数】
Prime Path(POJ - 3126)
算法
BFS+筛素数打表
1.题目主要就是给定你两个四位数的质数a,b,让你计算从a变到b共最小需要多少步。要求每次只能变1位,并且变1位后仍然为质数。
2.四位数的范围是1000~9999,之间共有1000多个质数。由于已经知道位数为4位,所以可以通过BFS来寻找最小步数。每次需要分别变换个位、十位、百位、千位,并且把符合要求的数放到队列中,同时需标记这个数已经遍历过一次,避免重复遍历,直到找到目标数。
C++代码
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1e4;
int primes[N], cnt;
bool st[N];
bool vis[N];
int t, a, b;
struct Number{
int data;
int steps;
};
void get_primes(int n)
{
for(int i = 2; i <= n; i++)
{
if(!st[i]) primes[cnt++] = i;
for(int j = 0; primes[j] <= n / i; j++)
{
st[primes[j]*i] = true;
if(i % primes[j] == 0) break;
}
}
}
void bfs()
{
queue<Number> que;
que.push({a, 0});
vis[a] = true;
while(que.size())
{
Number cur = que.front();
que.pop();
if(cur.data == b)
{
cout << cur.steps << endl;
return ;
}
Number tmp;
/*遍历可能的个位*/
for(int i = 0; i <= 9; i++)
{
tmp.data = cur.data / 10 * 10 + i;
if(vis[tmp.data] || st[tmp.data]) continue;
tmp.steps = cur.steps + 1;
que.push(tmp);
vis[tmp.data] = true;
}
/*遍历可能的十位*/
for(int i = 0; i <= 9; i++)
{
tmp.data = cur.data / 100 * 100 + i * 10 + cur.data % 10;
if(vis[tmp.data] || st[tmp.data]) continue;
tmp.steps = cur.steps + 1;
que.push(tmp);
vis[tmp.data] = true;
}
/*遍历可能的百位*/
for(int i = 0; i <= 9; i++)
{
tmp.data = cur.data % 100 + i * 100 + cur.data / 1000 * 1000;
if(vis[tmp.data] || st[tmp.data]) continue;
tmp.steps = cur.steps + 1;
que.push(tmp);
vis[tmp.data] = true;
}
/*遍历可能的千位*/
for(int i = 1; i <= 9; i++)
{
tmp.data = cur.data % 1000 + i * 1000;
if(vis[tmp.data] || st[tmp.data]) continue;
tmp.steps = cur.steps + 1;
que.push(tmp);
vis[tmp.data] = true;
}
}
}
int main()
{
get_primes(9999);
cin >> t;
while(t--)
{
memset(vis, 0, sizeof vis);
cin >> a >> b;
bfs();
}
}
代码中使用的线性筛素数模板来源
Prime Path(POJ - 3126)【BFS+筛素数】的更多相关文章
- kuangbin专题 专题一 简单搜索 Prime Path POJ - 3126
题目链接:https://vjudge.net/problem/POJ-3126 题意:给你两个四位的素数N,M,每次改变N四位数中的其中一位,如果能经过有限次数的替换变成四位数M,那么求出最少替换次 ...
- Mathematics:Prime Path(POJ 3126)
素数通道 题目大意:给定两个素数a,b,要你找到一种变换,使得每次变换都是素数,如果能从a变换到b,则输出最小步数,否则输出Impossible 水题,因为要求最小步数,所以我们只需要找到到每个素数的 ...
- Prime Path (poj 3126 bfs)
Language: Default Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11703 Ac ...
- Prime Path(POJ 3126 BFS)
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15325 Accepted: 8634 Descr ...
- poj3126 Prime Path 广搜bfs
题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...
- POJ-2689 Prime Distance (两重筛素数,区间平移)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13961 Accepted: 3725 D ...
- poj 3126 Bfs
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14539 Accepted: 8196 Descr ...
- Prime Path[POJ3126] [SPFA/BFS]
描述 孤单的zydsg又一次孤单的度过了520,不过下一次不会再这样了.zydsg要做些改变,他想去和素数小姐姐约会. 所有的路口都被标号为了一个4位素数,zydsg现在的位置和素数小姐姐的家也是这样 ...
- POJ - 3126 bfs + 素数筛法 [kuangbin带你飞]专题一
题意:给定两个四位素数作为终点和起点,每次可以改变起点数的某一位,且改变后的数仍然是素数,问是否可能变换成终点数字? 思路:bfs搜索,每次改变四位数中的某一位.素数打表方便判断新生成的数是否是素数. ...
随机推荐
- JavaScript基础语法资料
JavaScript基础第01天 1 - 编程语言 1.1 编程 编程: 就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 计算机程序: 就是计算机所执行的一系列的 ...
- 【转】Android 5.0 : Parsing Data for android-21 failed unsupported major.minor version 51.0
http://code2care.org/pages/parsing-data-for-android-21-failed-unsupported-major.minor-version-51.0/ ...
- 避免nullpointer 空指针
来自知乎: 一般在服务器返回的数据上我们会做数据合法性检测,所以在api文档上需要注明字段的取值范围,然后客户端根据这个去做数据检测,缺段就直接走数据错误的流程,这个很大程度上避免了不少nullpoi ...
- Mysql 部署
设置 path 环境变量 C:\mysql\mysql-5.7.17-winx64\bin; 创建C:\mysql\mysql-5.7.17-winx64\my.ini 内容如下 [mysql] # ...
- qdu-小明的贪心题(最短路+最短路的数量 )
Description 小明来到青岛上学已经一年了,他给青岛这座城市画了一张地图.在这个地图上有n个点,小明的起始点为1号点,终点为n号点,并且地图上的所有边都是单向的.小明知道从i号点到j号点的时间 ...
- Mybatis实例增删改查(二)
创建实体类: package com.test.mybatis.bean; public class Employee { private Integer id; private String las ...
- Avtiviti工作流规范 BPM与BPMN
进过长时间的轮转,重拾Activiti,因为最近在智联上看到多家公司的需求上写的,都要熟悉工作流引擎,也就是activiti所以重拾 之前看的视屏是activiti5,我觉得版本有点低,所以打算看一下 ...
- Oracle WITH 语句 语法
With语句可以在查询中做成一个临时表/View,用意是在接下来的SQL中重用,而不需再写一遍. With Clause方法的优点: 增加了SQL的易读性,如果构造了多个子查询,结构会更清晰. 示例: ...
- kali命令大全
arch 显示机器的处理器架构(1)uname -m 显示机器的处理器架构(2)uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)hd ...
- Linux(CentOS7)安装Tomcat (Tomcat+JDK)
安装Tomcat首先要安装jdk,jdk和tomcat安装可以使用的方法:将jdk.tomcat上传到Linux,然后解压后使用,另一种方法是直接使用在线安装:yum 第一步:安装jdk,在Linux ...