题目链接:https://www.luogu.org/problemnew/show/P1379

题意:用字符串表示八数码,求根据给定八数码得到末状态“123804765”最少的步数。

思路:这题很方便用双向bfs来优化,用两个队列分别从起点、终点开始搜索,两个map来记录该状态的步数。要注意的是起始状态和末状态相等的情况,需要特判。

AC代码:

  1. #include<cstdio>
  2. #include<queue>
  3. #include<algorithm>
  4. #include<string>
  5. #include<map>
  6. #include<iostream>
  7. using namespace std;
  8.  
  9. struct node{
  10. string s;
  11. int step,w;
  12. };
  13.  
  14. int go[]={-,,-,};
  15. queue<node> q1,q2;
  16. map<string,int> mp1,mp2;
  17.  
  18. bool isOK(int w,int k){
  19. int x=w+go[k];
  20. if(x<||x>) return false;
  21. if(w%==&&k==) return false;
  22. if(w%==&&k==) return false;
  23. return true;
  24. }
  25.  
  26. void bfs(){
  27. while(!q1.empty()&&!q2.empty()){
  28. node now1=q1.front();q1.pop();
  29. string s1=now1.s;
  30. int step1=now1.step,w1=now1.w;
  31. for(int i=;i<;++i){
  32. if(!isOK(w1,i)) continue;
  33. int ww=w1+go[i],st=step1+;
  34. string ss=s1;
  35. swap(ss[w1],ss[ww]);
  36. if(mp1[ss]) continue;
  37. if(mp2[ss]){
  38. printf("%d\n",step1+mp2[ss]-);
  39. return;
  40. }
  41. mp1[ss]=st;
  42. node tmp={ss,st,ww};
  43. q1.push(tmp);
  44. }
  45.  
  46. node now2=q2.front();q2.pop();
  47. string s2=now2.s;
  48. int step2=now2.step,w2=now2.w;
  49. for(int i=;i<;++i){
  50. if(!isOK(w2,i)) continue;
  51. int ww=w2+go[i],st=step2+;
  52. string ss=s2;
  53. swap(ss[w2],ss[ww]);
  54. if(mp2[ss]) continue;
  55. if(mp1[ss]){
  56. printf("%d\n",step2+mp1[ss]-);
  57. return;
  58. }
  59. mp2[ss]=st;
  60. node tmp={ss,st,ww};
  61. q2.push(tmp);
  62. }
  63. }
  64. }
  65.  
  66. int main(){
  67. string s;
  68. cin>>s;
  69. if(s==""){
  70. printf("0\n");
  71. return ;
  72. }
  73. int w;
  74. for(int i=;i<s.length();++i)
  75. if(s[i]==''){
  76. w=i;break;
  77. }
  78. node bg={s,,w};
  79. node ed={"",,};
  80. mp1[s]=,mp2[""]=;
  81. q1.push(bg),q2.push(ed);
  82. bfs();
  83. return ;
  84. }

luoguP1379-八数码难题(双向bfs)的更多相关文章

  1. luoguP1379 八数码难题[启发式搜索]

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...

  2. 【洛谷】P1379 八数码难题(bfs)

    题目 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局 ...

  3. HDOJ-1043 Eight(八数码问题+双向bfs+高效记录路径+康拓展开)

    bfs搜索加记录路径 HDOJ-1043 主要思路就是使用双向广度优先搜索,找最短路径.然后记录路径,找到结果是打印出来. 使用康拓序列来来实现状态的映射. 打印路径推荐使用vector最后需要使用a ...

  4. 八数码问题 双向BFS/Hsh链表存储

    转自洛谷 作者EndSaH #include<iostream> #include<string> #include<cmath> #include<cstr ...

  5. cdoj 414 八数码 (双向bfs+康拓展开,A*)

    一道关乎人生完整的问题. DBFS的优越:避免了结点膨胀太多. 假设一个状态结点可以扩展m个子结点,为了简单起见,假设每个结点的扩展都是相互独立的. 分析:起始状态结点数为1,每加深一层,结点数An ...

  6. 洛谷——P1379 八数码难题

    P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...

  7. 习题:八数码难题(双向BFS)

    八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...

  8. 双向广搜+hash+康托展开 codevs 1225 八数码难题

    codevs 1225 八数码难题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description Yours和zero在研究A*启 ...

  9. 「LuoguP1379」 八数码难题(迭代加深

    [P1379]八数码难题 - 洛谷 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种 ...

  10. Codevs 1225 八数码难题

    1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的 ...

随机推荐

  1. HTML5测试题整理Ⅰ

    1.在 HTML5 中,哪个元素用于组合标题元素? 答案:<hgroup>   2.HTML5 中不再支持哪个元素? 答案:<font>,<acronym>,< ...

  2. js中声明函数的区别

    在JS中有两种定义函数的方式, 1是var aaa=function(){...} 2是function aaa(){...} var 方式定义的函数,不能先调用函数,后声明,只能先声明函数,然后调用 ...

  3. ueditor编辑器+粘贴word

    最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...

  4. C Vus the Cossack and Strings ( 异或 思维)

    题意 : 给你两个只包含 0 和 1 的字符串 a, b,定义函数 f ( A, B ) 为 字符串A和字符串B 比较 存在多少个位置 i 使得 A[ i ] != B[ i ] ,例如 f(0011 ...

  5. Luogu P5652 基础博弈练习题 (博弈论、图论)

    题目链接 https://www.luogu.org/problem/P5652 题解 好题,想了四小时-- 首先考虑如何判断胜负: 首先假设只有一个柱子,那就是奇败偶胜.不难发现最后一个奇数后面的偶 ...

  6. AtCoder AGC032E Modulo Pairing (二分、贪心与结论)

    题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_e 题解 猜结论好题. 结论是: 按\(a_i\)从小到大排序之后,一定存在一种最优解,使得以 ...

  7. AtCoder AGC004E Salvage Robots (DP)

    题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_e 题解 本题的难度不在于想到大体思路,而在于如何把代码写对.. 首先我们可以不让机器人动,让 ...

  8. Tishreen-CPC 2018 G. Colors Overflow(分块)

    Problem G. Colors Overflow Input file: standard input Output file: standard output Balloon Color: Da ...

  9. zookeeper系列(七)zookeeper的序列化及通讯协议

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败.原创地址http://www.cnblogs.com/leesf456/p/6091208.html尊重作者原创,奇文共欣赏,大家共同学 ...

  10. Appium+Robotframework实现iOS应用的自动化测试

    Appium+Robotframework实现iOS应用的自动化测试 连接地址: 地址:https://blog.csdn.net/wd168/article/month/2016/06 1.http ...