素数通道

  题目大意:给定两个素数a,b,要你找到一种变换,使得每次变换都是素数,如果能从a变换到b,则输出最小步数,否则输出Impossible

  水题,因为要求最小步数,所以我们只需要找到到每个素数的最小步数就可以了,每个权都是1,所以用BFS就可以了,一开始我还用DFS,太丢人了,一开始就把素数表打好就可以了

  

  1. #include <iostream>
  2. #include <functional>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. typedef int Position;
  8. typedef struct _set
  9. {
  10. char num[];
  11. }Set,Queue;
  12. bool BFS(const int);
  13. void Search_Prime(void);
  14. int Get_Num(char *);
  15.  
  16. static bool prime_set[];
  17. static char num[], goal_set[];
  18. static int min_step[], pow_sum[] = { , , , };
  19. static void Push(char *,Position);
  20. static char *Pop(Position);
  21. Queue que[ * ];
  22.  
  23. int main(void)
  24. {
  25. int case_sum, goal_num;
  26.  
  27. Search_Prime();
  28. scanf("%d", &case_sum);
  29.  
  30. while (case_sum--)
  31. {
  32. getchar();
  33. scanf("%c%c%c%c", &num[], &num[], &num[], &num[]);
  34. getchar();
  35. scanf("%c%c%c%c", &goal_set[], &goal_set[], &goal_set[], &goal_set[]);
  36. goal_num = Get_Num(goal_set);
  37. if (!BFS(goal_num))
  38. printf("Impossible\n");
  39. }
  40.  
  41. return ;
  42. }
  43.  
  44. int Get_Num(char *s)
  45. {
  46. int ans = ;
  47. for (int i = ; i < ; i++)
  48. ans += (s[ - i] - '') * pow_sum[i];
  49. return ans;
  50. }
  51.  
  52. void Search_Prime(void)//线筛法打表
  53. {
  54. int i, j;
  55. prime_set[] = ;
  56. memset(prime_set, , sizeof(prime_set));
  57. for (i = ; i < ; i++)
  58. {
  59. for (j = ; j <= i && i*j < ; j++)
  60. if (!prime_set[j])
  61. prime_set[i*j] = ;
  62. }
  63. }
  64.  
  65. static void Push(char *num, Position back)
  66. {
  67. for (int i = ; i < ; i++)
  68. que[back].num[i] = num[i];
  69. }
  70.  
  71. static char *Pop(Position head)
  72. {
  73. return que[head].num;
  74. }
  75.  
  76. bool BFS(const int goal)
  77. {
  78. memset(min_step, -, sizeof(min_step));
  79. Position head = , back = ;
  80. int i, j, sum_tmp, step_now;
  81. char *out, tmp_int;
  82.  
  83. sum_tmp = Get_Num(num);
  84. if (sum_tmp == goal)
  85. {
  86. printf("0\n");
  87. return true;
  88. }
  89. Push(num, back++); min_step[sum_tmp] = ;
  90.  
  91. while (head != back)
  92. {
  93. out = Pop(head++); sum_tmp = Get_Num(out);
  94. step_now = min_step[sum_tmp];
  95. for (i = ; i < ; i++)
  96. {
  97. tmp_int = out[i];
  98. for (j = ; j < ; j++)
  99. {
  100. if (i == && j == || tmp_int == j + '') continue;
  101. out[i] = j + '';
  102. sum_tmp = Get_Num(out);
  103. if (min_step[sum_tmp] == - && !prime_set[sum_tmp])
  104. {
  105. min_step[sum_tmp] = step_now + ;
  106. Push(out, back++);
  107. if (sum_tmp == goal)
  108. {
  109. printf("%d\n", min_step[sum_tmp]);
  110. return true;
  111. }
  112. }
  113. }
  114. out[i] = tmp_int;
  115. }
  116. }
  117. return false;
  118. }

Mathematics:Prime Path(POJ 3126)的更多相关文章

  1. Prime Path(POJ - 3126)【BFS+筛素数】

    Prime Path(POJ - 3126) 题目链接 算法 BFS+筛素数打表 1.题目主要就是给定你两个四位数的质数a,b,让你计算从a变到b共最小需要多少步.要求每次只能变1位,并且变1位后仍然 ...

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

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

  3. POJ - 3126 - Prime Path(BFS)

    Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数 ...

  4. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  5. poj 3126 Prime Path bfs

    题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  6. POJ 3126 Prime Path(素数路径)

    POJ 3126 Prime Path(素数路径) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 The minister ...

  7. BFS POJ 3126 Prime Path

    题目传送门 /* 题意:从一个数到另外一个数,每次改变一个数字,且每次是素数 BFS:先预处理1000到9999的素数,简单BFS一下.我没输出Impossible都AC,数据有点弱 */ /**** ...

  8. Prime Path(poj 3126)

    Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...

  9. Prime Path(POJ 3126 BFS)

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

随机推荐

  1. R 语言程序设计

    Data The zip file containing the data can be downloaded here: specdata.zip [2.4MB] The zip file cont ...

  2. Django 部署

    话说这个部署挺折腾人的,先开始使用 mod_python ,貌似版本一直有问题,没成功过,以后再试. 使用 mod_wsgi 成功,记录如下: 1.下载 mod_wsgi: http://code.g ...

  3. Jquery实现滚动显示欢迎字幕效果

    Jquery控制滚动显示欢迎字幕: 参考代码: <!DOCTYPE html> <html> <head> <title>Colin Marquee W ...

  4. 开源一个动态解析protobuf的工具

    好久没写博客了,主要是这一年技术没啥长进都打杂了,还有就是生活琐事越来越多,人也越来越懒了…… 之前项目中用到了Protobuf,然后测试发现这玩意不好测,总不能每次定个协议或者改下都要编译Java代 ...

  5. QT共享库的创建与调用(初级)(附:UI界面不能被改变的其中一个原因)

    背景: 最近在做的一个项目其中一部分既是实现PC与下位机的USB通信.windows平台下已经完成,现需移植到linux平台下. 在linux系统中,通过一段时间的工作,设备已被配置成hid类(后续再 ...

  6. github 上传至远程的过程

    参考网址:http://luolei.org/dotfiles-tutorial/ http://www.ruanyifeng.com/blog/2014/06/git_remote.html     ...

  7. Windows下几个常用的和进程有关的命令

    在windows下,进入cmd,有几个常用的和进程有关的命令: netstat -ano:查看所有进程 netstat -ano|findstr  “端口号”:查看端口号对应的进程PID taskli ...

  8. memcache安装

    windows下访问 http://pecl.php.net/package/memcache/3.0.8/windows 下载对应版本memcache的dll文件添加到php目录ext下 PHP.i ...

  9. 关于JavaScript中对象的继承实现的学习总结

    一.原型链 JavaScript 中原型链是实现继承的主要方法.其主要的思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.实现原型链有一种基本模式,其代码如下. function Super ...

  10. vim编译运行java程序

    想让你的vim可以编译运行java只要在你的配置文件里面加一句: map <F5> :!javac %&&java %:r <CR> 就可以编译运行java了