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+筛素数】的更多相关文章

  1. kuangbin专题 专题一 简单搜索 Prime Path POJ - 3126

    题目链接:https://vjudge.net/problem/POJ-3126 题意:给你两个四位的素数N,M,每次改变N四位数中的其中一位,如果能经过有限次数的替换变成四位数M,那么求出最少替换次 ...

  2. Mathematics:Prime Path(POJ 3126)

    素数通道 题目大意:给定两个素数a,b,要你找到一种变换,使得每次变换都是素数,如果能从a变换到b,则输出最小步数,否则输出Impossible 水题,因为要求最小步数,所以我们只需要找到到每个素数的 ...

  3. Prime Path (poj 3126 bfs)

    Language: Default Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11703   Ac ...

  4. Prime Path(POJ 3126 BFS)

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15325   Accepted: 8634 Descr ...

  5. poj3126 Prime Path 广搜bfs

    题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...

  6. POJ-2689 Prime Distance (两重筛素数,区间平移)

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13961   Accepted: 3725 D ...

  7. poj 3126 Bfs

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14539   Accepted: 8196 Descr ...

  8. Prime Path[POJ3126] [SPFA/BFS]

    描述 孤单的zydsg又一次孤单的度过了520,不过下一次不会再这样了.zydsg要做些改变,他想去和素数小姐姐约会. 所有的路口都被标号为了一个4位素数,zydsg现在的位置和素数小姐姐的家也是这样 ...

  9. POJ - 3126 bfs + 素数筛法 [kuangbin带你飞]专题一

    题意:给定两个四位素数作为终点和起点,每次可以改变起点数的某一位,且改变后的数仍然是素数,问是否可能变换成终点数字? 思路:bfs搜索,每次改变四位数中的某一位.素数打表方便判断新生成的数是否是素数. ...

随机推荐

  1. ansible代码分析第一篇--主文件&mdash;ansible分析

    2016年2月23日,学习,分析ansible代码 ansible是一种运维中使用的批量部署的工具,它本身是一种框架,具体的部署和架构分析,下面这篇文章讲的不错. http://os.51cto.co ...

  2. c++之路进阶——codevs4543(普通平衡树)

    4543 普通平衡树  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master       题目描述 Description 这是一道水题 顺便祝愿LEZ和ZQQ 省 ...

  3. [AngularJS] Using ngModel in Custom Directives

    You can use ngModel in your own directives, but there are a few things you'll need to do to get it w ...

  4. gerrit升级到16.04之后连接不到服务器

    升级到ubuntu-16.04后,发现Git-review代码报错: Unable to negotiate with 10.140.110.77 port 29418: no matching ke ...

  5. OpenStack25

    OpenStack(25) API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组 ...

  6. 队列优化和斜率优化的dp

    可以用队列优化或斜率优化的dp这一类的问题为 1D/1D一类问题 即状态数是O(n),决策数也是O(n) 单调队列优化 我们来看这样一个问题:一个含有n项的数列(n<=2000000),求出每一 ...

  7. Chapter 7. Design and Performance

    本章将对MPEG4及H.264的实现细节进行讲解和比对. Motion Estimation 衡量运动估计的好坏有三种函数(第228页):MSE,MAE和SAE,其中由于SAE运算速度最快所以采用的最 ...

  8. 201521123028 《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  9. python小知识-属性查询优先级(如果有同名类属性、数据描述符、实例属性存在的话,实例&gt;类&gt;数据描述符)

    https://www.cnblogs.com/Jimmy1988/p/6808237.html https://segmentfault.com/a/1190000006660339 https:/ ...

  10. python 正则表达式 group() groups()

    参考地址: http://www.cnblogs.com/kaituorensheng/archive/2012/08/20/2648209.html