题目链接:http://poj.org/problem?id=3126

题意:

给定两个四位素数 $a,b$,要求把 $a$ 变换到 $b$。变换的过程每次只能改动一个数,要保证每次变换出来的数都是一个没有前导零的四位素数。

要求每步得到的素数都不能重复,求从 $a$ 到 $b$ 最少需要变换多少步;如果无法达到则输出Impossible。

题解:

在BFS之前先用线性筛筛出 $10000$ 以内的素数,方便后面判断是否为素数。

剩下的就是从 $a$ 为起点,入队并标记已经出现过。每次队列非空就取出队头,尝试把这个数的每一位全部改一编,是素数且没出现过的就入队并标记。

循环往复,直到到达 $b$;或者队列空了还没找到。

AC代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef pair<int,int> pii;
  7.  
  8. int st,ed;
  9.  
  10. /************************** 线性筛 - st **************************/
  11. const int MAX=;
  12. int cnt,prime[MAX+];
  13. bool isPrime[MAX+];
  14. void Screen() //欧拉筛法求素数
  15. {
  16. cnt=;
  17. memset(isPrime,,sizeof(isPrime));
  18. isPrime[]=isPrime[]=;
  19. for(int i=;i<=MAX;i++)
  20. {
  21. if(isPrime[i]) prime[cnt++]=i;
  22. for(int j=;j<cnt;j++)
  23. {
  24. if(i*prime[j]>MAX) break;
  25. isPrime[i*prime[j]]=;
  26. if(i%prime[j]==) break;
  27. }
  28. }
  29. }
  30. /************************** 线性筛 - ed **************************/
  31.  
  32. queue<pii> Q;
  33. bool vis[MAX+];
  34. int bfs()
  35. {
  36. memset(vis,,sizeof(vis));
  37. while(!Q.empty()) Q.pop();
  38.  
  39. Q.push(make_pair(st,));
  40. vis[st]=;
  41. while(!Q.empty())
  42. {
  43. pii now=Q.front(); Q.pop();
  44. if(now.first==ed) return now.second;
  45.  
  46. for(int i=;i<=;i++) //千位
  47. {
  48. int k=now.first/;
  49. if(k==i) continue;
  50. pii nxt=make_pair(now.first-k*+i*,now.second+);
  51. if(isPrime[nxt.first] && !vis[nxt.first])
  52. {
  53. Q.push(nxt);
  54. vis[nxt.first]=;
  55. }
  56. }
  57. for(int i=;i<=;i++) //百位
  58. {
  59. int k=(now.first%)/;
  60. if(k==i) continue;
  61. pii nxt=make_pair(now.first-k*+i*,now.second+);
  62. if(isPrime[nxt.first] && !vis[nxt.first])
  63. {
  64. Q.push(nxt);
  65. vis[nxt.first]=;
  66. }
  67. }
  68. for(int i=;i<=;i++) //十位
  69. {
  70. int k=(now.first%)/;
  71. if(k==i) continue;
  72. pii nxt=make_pair(now.first-k*+i*,now.second+);
  73. if(isPrime[nxt.first] && !vis[nxt.first])
  74. {
  75. Q.push(nxt);
  76. vis[nxt.first]=;
  77. }
  78. }
  79. for(int i=;i<=;i++) //个位
  80. {
  81. int k=now.first%;
  82. if(k==i) continue;
  83. pii nxt=make_pair(now.first-k+i,now.second+);
  84. if(isPrime[nxt.first] && !vis[nxt.first])
  85. {
  86. Q.push(nxt);
  87. vis[nxt.first]=;
  88. }
  89. }
  90. }
  91. return -;
  92. }
  93.  
  94. int main()
  95. {
  96. Screen();
  97. int T;
  98. scanf("%d",&T);
  99. while(T--)
  100. {
  101. scanf("%d%d",&st,&ed);
  102. int ans=bfs();
  103. if(ans==-) printf("Impossible\n");
  104. else printf("%d\n",ans);
  105. }
  106. }

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. 一步步教你轻松学KNN模型算法

    一步步教你轻松学KNN模型算法( 白宁超 2018年7月24日08:52:16 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用.本文通过一个模拟的实际案例进行讲解. ...

  2. vs2017 打开附带的localdb v13

    查看自己本机装了哪些版本的localdb 打开数据库资源管理器   添加数据库连接     选择要连接的localdb版本,这里选择的是v13版本      添加数据库   新建一个test数据库   ...

  3. Device does not seem to be present [常见错误解决]

    一.故障现象: [root@c1node01 ~]# service network restart Shutting down loopback insterface:                ...

  4. Winscp使用sudo user登录

    为了安全期间, 一般设置了禁止root用户ssh登录.使用普通用户登录后再sudo获取操作权限. 可为了文件传文件使用winscp,如何使用sudo登录以获取权限传文件呢 先在服务端设置sudo帐号权 ...

  5. Centos7.4修改主机名HostName颜色及格式

    一.打开 .bashrc文件 1.位置:~(cd ~)目录下 2.cat .bashrc 原文件内容如下: # .bashrc # User specific aliases and function ...

  6. 为什么要使用NoSQL

    转载自:http://www.infoq.com/cn/news/2011/01/nosql-why [编者按]NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都 ...

  7. SpringMvc的Url映射和传参案例(转)

    Springmvc的基本使用,包括url映射.参数映射.页面跳转.ajax和文件上传 以前学习的时候写的代码案例,今天整理笔记的时候找到了,很久没有来园子了,发上来当个在线笔记用吧,免的时间长了又忘了 ...

  8. [Linux]Linux下signal function传参方式

    https://stackoverflow.com/questions/6970224/providing-passing-argument-to-signal-handler This is a r ...

  9. github控件地址

    地址: https://github.com/wasabeef/awesome-android-ui http://www.jcodecraeer.com/plus/list.php?tid=31 h ...

  10. laravel框架生產vender文件夹

    方法一.修改拓展 去php.ini中查看下面三个扩展项是否开启 extension=php_fileinfo.dll extension=php_mbstring.dll extension=php_ ...