欸我一直以为双向bfs是搜完一半再搜另一半呢,妹想到是两个一起搜

然后队列里放的结构体里不能直接存答案,所以做一个邻接表一样的东西,直接指向需要的字符即可

记录状态用康托展开来hash

以及居然是多组数据啊?!

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. const int N=500005,has[9]={1,1,2,6,24,120,720,5040,40320},dx[4]={-3,3,-1,1};
  7. int v1[N],v2[N];
  8. char a[30],d1[10]={"udlr"},d2[10]={"durl"};
  9. string b="123456780";
  10. struct qw
  11. {
  12. int a;
  13. char ch;
  14. qw(int A=0,char C=0)
  15. {
  16. a=A,ch=C;
  17. }
  18. }pre[N];
  19. struct qwe
  20. {
  21. int a;
  22. string c;
  23. qwe(int A=0,string C="")
  24. {
  25. a=A,c=C;
  26. }
  27. }e;
  28. void print(int x)
  29. {
  30. if(pre[x].a==-1)
  31. return;
  32. print(pre[x].a);
  33. printf("%c",pre[x].ch);
  34. }
  35. int ha(string e)
  36. {
  37. int s=0,i,j,k;
  38. for(i=0;i<9;i++)
  39. {
  40. k=0;
  41. for(j=0;j<i;j++)
  42. if(e[j]>e[i])
  43. k++;
  44. s+=k*has[i];
  45. }
  46. return s;
  47. }
  48. int main()
  49. {
  50. while(gets(a))
  51. {
  52. int k=0;
  53. e.c="";
  54. for(int i=0,j=0;i<strlen(a);i++)
  55. if(a[i]!=' ')
  56. {
  57. if(a[i]=='x')
  58. e.a=j,e.c+='0';
  59. else
  60. e.c+=a[i];
  61. j++;
  62. }
  63. for(int i=0;i<9;i++)
  64. if(e.c[i]!='0')
  65. for(int j=0;j<i;j++)
  66. if(e.c[j]!='0'&&e.c[j]>e.c[i])
  67. k++;
  68. memset(v2,0,sizeof(v2));
  69. memset(v1,0,sizeof(v1));
  70. if(k&1)
  71. printf("unsolvable\n");
  72. else
  73. {
  74. qwe f,g;
  75. int a=2;
  76. queue<qwe>q1,q2;
  77. v1[ha(e.c)]=1;
  78. pre[1].a=-1,pre[2].a=-1;
  79. f=qwe(8,b);
  80. v2[ha(f.c)]=2;
  81. q1.push(e),q2.push(f);
  82. while(!q1.empty()&&!q2.empty())
  83. {
  84. f=q1.front();
  85. q1.pop();
  86. int p=ha(f.c);
  87. if(v2[p])
  88. {
  89. print(v1[p]);
  90. for(int k=v2[p];pre[k].a!=-1;k=pre[k].a)
  91. printf("%c",pre[k].ch);
  92. printf("\n");
  93. break;
  94. }
  95. for(int i=0;i<4;i++)
  96. if((i!=0||f.a>=3)&&(i!=1||f.a<=5)&&(i!=2||f.a%3!=0)&&(i!=3||f.a%3!=2))
  97. {
  98. int x=f.a+dx[i];
  99. g=f;
  100. swap(g.c[f.a],g.c[x]);
  101. int q=ha(g.c);
  102. if(v1[q])
  103. continue;
  104. v1[q]=++a;
  105. g.a=x;
  106. pre[a]=qw(v1[p],d1[i]);
  107. q1.push(g);
  108. }
  109. f=q2.front();
  110. q2.pop();
  111. p=ha(f.c);
  112. if(v1[p])
  113. {
  114. print(v1[p]);
  115. for(int k=v2[p];pre[k].a!=-1;k=pre[k].a)
  116. printf("%c",pre[k].ch);
  117. printf("\n");
  118. break;
  119. }
  120. for(int i=0;i<4;i++)
  121. if((i!=0||f.a>=3)&&(i!=1||f.a<=5)&&(i!=2||f.a%3!=0)&&(i!=3||f.a%3!=2))
  122. {
  123. int x=f.a+dx[i];
  124. g=f;
  125. swap(g.c[f.a],g.c[x]);
  126. int q=ha(g.c);
  127. if(v2[q])
  128. continue;
  129. v2[q]=++a;
  130. g.a=x;
  131. pre[a]=qw(v2[p],d2[i]);
  132. q2.push(g);
  133. }
  134. }
  135. printf("unsolvable\n");
  136. }
  137. }
  138. return 0;
  139. }

hdu 1043 Eight的更多相关文章

  1. POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)

    思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...

  2. HDU 1043 Eight(八数码)

    HDU 1043 Eight(八数码) 00 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)   Problem Descr ...

  3. Eight POJ - 1077 HDU - 1043 八数码

    Eight POJ - 1077 HDU - 1043 八数码问题.用hash(康托展开)判重 bfs(TLE) #include<cstdio> #include<iostream ...

  4. HDU - 1043 - Eight / POJ - 1077 - Eight

    先上题目: Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  5. HDU 1043 Eight 八数码问题 A*算法(经典问题)

    HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...

  6. POJ 1077 && HDU 1043 Eight A*算法,bfs,康托展开,hash 难度:3

    http://poj.org/problem?id=1077 http://acm.hdu.edu.cn/showproblem.php?pid=1043 X=a[n]*(n-1)!+a[n-1]*( ...

  7. hdu 1043 Eight 经典八数码问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 The 15-puzzle has been around for over 100 years ...

  8. hdu 1043 pku poj 1077 Eight (BFS + 康拓展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 http://poj.org/problem?id=1077 Eight Time Limit: 1000 ...

  9. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  10. HDU 1043 Eight(反向BFS+打表+康托展开)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 题目大意:传统八数码问题 解题思路:就是从“12345678x”这个终点状态开始反向BFS,将各 ...

随机推荐

  1. Unity Water Shader

    上图是一个物体浸入水中的效果 原理 我们使用相机渲染的整个场景的深度图减去需要忽略的模型的深度,这里忽略的是图中蓝色部分,就保留了其他的深度值. 用到Main Camera渲染的深度贴图: sampl ...

  2. CC3200 TI 笔记

    I2C I2C总线是由Philips公司开发的一种简单.双向二线制同步串行总线.它只需要两根线即可在连接于总线上的器件之间传送信息. I2S I2S(Inter-IC Sound)总线, 又称 集成电 ...

  3. UVALive 6430 (水dp)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  4. csu - 1566: The Maze Makers (bfs)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1566 题意还是蛮难懂的,至少对于我来说,需要认真读题. 输入矩阵的每一个数字换成2进制后,顺时针围 ...

  5. java web 验证码 第一次不正确的问题,解决方案

    首先是form表单 ,获取图片验证码 然后使用js 去服务器验证 问题: 第一次明明输入正确 ,确验证不了??那是因为你在form表单发起请求 和 ajax  发起的请求  地址 中 一个使用127. ...

  6. 有用的 SystemTap 脚本

    https://segmentfault.com/a/1190000000680628 https://github.com/posulliv/stap

  7. LENOVO System x3850 X6

    http://appserver.lenovo.com.cn/Lenovo_Series_List.aspx?CategoryCode=A31B01

  8. 智能眼镜技术科普:VR、AR、MR的区别

    前段时间, 获得谷歌5亿美元融资的技术公司Magic Leap在WSJD展会中放出了一段实录视频,引起不小骚动.如今,也有媒体称他们为MR公司,那么VR.AR.MR之间到底有什么区别呢. VR.AR. ...

  9. 【Android归纳】回调机制在Android中的应用与实战

    回调这样的思想在程序中是比較普遍的.有时候可能我们并没有注意到.近期整理了一些对于回调的理解,分享给大家 先上概念...... 什么是回调函数? 回调函数就是一个通过函数指针调用的函数. 假设你把函数 ...

  10. netty4与protocol buffer结合简易教程

    各项目之间通常使用二进制进行通讯,占用带宽小.处理速度快~ 感谢netty作者Trustin Lee.让netty天生支持protocol buffer. 本实例使用netty4+protobuf-2 ...