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. 焦大:做SEO应该研究的用户需求的方向

    http://www.wocaoseo.com/thread-60-1-1.html 最近收到打击很大,收获也颇多,这一切都莫过于用户需求的问题.我曾经给我弟说过,我对检索排名特征识别.提取和计算自认 ...

  2. 23种设计模式(C++)

    每一种都有对应理解的相关代码示例 → Git原码 一. GOF-23 模式分类 从目的来看 • 创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创 ...

  3. 【Nginx】如何基于主从模式搭建Nginx+Keepalived双机热备环境?这是最全的一篇了!!

    写在前面 最近出版了<海量数据处理与大数据技术实战>,详情可以关注 冰河技术 微信公众号,查看<我的<海量数据处理与大数据技术实战>出版啦!>一文. 也有不少小伙伴 ...

  4. Selenium使用cookis登录,并临时将cookis存储在本地【shelve数据库】

    Python中自带了一个shelve库,可以帮助我们存储一些少量的数据. shelve数据库类似redis,是以[键值对]的方式进行数据的存储,有点像"字典"这种数据结构,存储在本 ...

  5. P4719 【模板】"动态 DP"&动态树分治

    题目描述 给定一棵 n 个点的树,点带点权. 有 m 次操作,每次操作给定 x,y,表示修改点 x 的权值为 y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 输入格式 第一行有两个整数 ...

  6. spring集成shiro,事务失效问题 not eligible for auto-proxying

    BeanPostProcessor bean实例化顺序有关,@Configuration会最先实例化,也就是在spring启动完成之前. 导致Configuration中使用的注入,没能在spring ...

  7. java初探(1)之登录总结

    登录总结 前几章总结了登录各个步骤中遇到的问题,现在完成的做一个登录的案例,其难点不在于实现功能,而在于抽象各种功能模块,提高复用性,较低耦合度. 前端页面: 对于前端页面来说,不是后端程序员要考虑的 ...

  8. web前端常见安全问题

    1,SQL注入 2,XSS 3,CSRF 4.文件上传漏洞 1,SQL注入:这个比较常见,可能大家也听说过,就是URL里面如果有对数据库进行操作的参数时,要做一下特殊的处理,否则被别有用心的人利用的话 ...

  9. 为系统增加删除swap空间

    增加 1.创建/home/swap这么一个分区文件.文件大小是512000个block,一般情况下1个block为1k,所以这里空间是512M,这个空间大小自己随意定义. dd if=/dev/zer ...

  10. Oracle的timestamp字段更新实验 结论:只有逐条更新才能保证timestamp字段有差别,批量更新只会得到一致的时间,此操作无关时间精度.

    有这么一张表: create table hy_testtime( id number(6,0) not null primary key, name nvarchar2(20) not null, ...