Prime Path(POJ - 3126)

题目链接

算法

BFS+筛素数打表

1.题目主要就是给定你两个四位数的质数a,b,让你计算从a变到b共最小需要多少步。要求每次只能变1位,并且变1位后仍然为质数。

2.四位数的范围是1000~9999,之间共有1000多个质数。由于已经知道位数为4位,所以可以通过BFS来寻找最小步数。每次需要分别变换个位、十位、百位、千位,并且把符合要求的数放到队列中,同时需标记这个数已经遍历过一次,避免重复遍历,直到找到目标数。

C++代码

  1. #include<iostream>
  2. #include<cstring>
  3. #include<queue>
  4. using namespace std;
  5. const int N = 1e4;
  6. int primes[N], cnt;
  7. bool st[N];
  8. bool vis[N];
  9. int t, a, b;
  10. struct Number{
  11. int data;
  12. int steps;
  13. };
  14. void get_primes(int n)
  15. {
  16. for(int i = 2; i <= n; i++)
  17. {
  18. if(!st[i]) primes[cnt++] = i;
  19. for(int j = 0; primes[j] <= n / i; j++)
  20. {
  21. st[primes[j]*i] = true;
  22. if(i % primes[j] == 0) break;
  23. }
  24. }
  25. }
  26. void bfs()
  27. {
  28. queue<Number> que;
  29. que.push({a, 0});
  30. vis[a] = true;
  31. while(que.size())
  32. {
  33. Number cur = que.front();
  34. que.pop();
  35. if(cur.data == b)
  36. {
  37. cout << cur.steps << endl;
  38. return ;
  39. }
  40. Number tmp;
  41. /*遍历可能的个位*/
  42. for(int i = 0; i <= 9; i++)
  43. {
  44. tmp.data = cur.data / 10 * 10 + i;
  45. if(vis[tmp.data] || st[tmp.data]) continue;
  46. tmp.steps = cur.steps + 1;
  47. que.push(tmp);
  48. vis[tmp.data] = true;
  49. }
  50. /*遍历可能的十位*/
  51. for(int i = 0; i <= 9; i++)
  52. {
  53. tmp.data = cur.data / 100 * 100 + i * 10 + cur.data % 10;
  54. if(vis[tmp.data] || st[tmp.data]) continue;
  55. tmp.steps = cur.steps + 1;
  56. que.push(tmp);
  57. vis[tmp.data] = true;
  58. }
  59. /*遍历可能的百位*/
  60. for(int i = 0; i <= 9; i++)
  61. {
  62. tmp.data = cur.data % 100 + i * 100 + cur.data / 1000 * 1000;
  63. if(vis[tmp.data] || st[tmp.data]) continue;
  64. tmp.steps = cur.steps + 1;
  65. que.push(tmp);
  66. vis[tmp.data] = true;
  67. }
  68. /*遍历可能的千位*/
  69. for(int i = 1; i <= 9; i++)
  70. {
  71. tmp.data = cur.data % 1000 + i * 1000;
  72. if(vis[tmp.data] || st[tmp.data]) continue;
  73. tmp.steps = cur.steps + 1;
  74. que.push(tmp);
  75. vis[tmp.data] = true;
  76. }
  77. }
  78. }
  79. int main()
  80. {
  81. get_primes(9999);
  82. cin >> t;
  83. while(t--)
  84. {
  85. memset(vis, 0, sizeof vis);
  86. cin >> a >> b;
  87. bfs();
  88. }
  89. }

代码中使用的线性筛素数模板来源

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. 2020重新出发,MySql基础,性能优化

    @ 目录 MySQL性能优化 MySQL性能优化简述 使用 SHOW STATUS 命令 使用慢查询日志 MySQL 查询分析器 EXPLAIN DESCRIBE 索引对查询速度的影响 MySQL优化 ...

  2. 释放数据价值:DAYU数据运营新能力解读

    摘要:从比特到信息,这说的其实就是企业数字化转型,让数据的价值充分发挥出来,变成信息. 今天,企业对数据越来越重视,数据已经成为了企业新型的资产,甚至是核心资产,最近流传一句非常有意思的话:从比特到信 ...

  3. Spark保存的时候怎么去掉多余的引号转义

    今天用SparkSQL保存一份json数据的时候,引号被转义了,并用括号包起来了,导致下游新来的小伙伴无法处理这份数据. 保存后的数据长这样(用\t分割): data "{\"ke ...

  4. 我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

    业务背景 首先,业务需求是这样的,从第三方电商平台拉取所有订单,然后保存到公司自己的数据库,需要判断是否有物流信息,如果有物流信息,还需要再进行上传. 而第三方接口返回的数据是 JSON 格式的,其中 ...

  5. package_ios

    PlistBuddy简单使用 https://www.jianshu.com/p/2167f755c47e xcodebuild 命令 https://www.jianshu.com/p/c32263 ...

  6. Apollo(阿波罗)配置中心Java客户端使用指南使用指南

          Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管 ...

  7. 软件架构与设计 百度网盘的pdf电子书籍

    如有版权问题请及时联系小编 软件架构与设计 百度网盘的pdf电子书籍 1:<软件体系结构(PDF)>https://pan.baidu.com/s/1lChfIJt5lc63KO09n5L ...

  8. java-介绍函数理解重载

    package day02; public class FunctionOverload { public static void main(String[] args){ int a = add(, ...

  9. leetcode刷题-54螺旋矩阵

    题目 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 思路 对于每个外层,从左上方开始以顺时针的顺序遍历所有元素.假设当前层的左上角位于(to ...

  10. SpringBoot+Shiro+JPA+LayUI的后台管理系统

    一.系统说明 资源下载路径:https://download.csdn.net/download/qq_37171817/12056804 本系统是一个用SpringBoot做后台开发框架,Shiro ...