A*搜索。

A*搜索的基础百度百科(实在偷懒没看论文之类的),在这里不说了。

A*搜索很关键的是h(n)估价函数的选取(表示现在到结束节点需要的距离)

设d(n)为实际到结束节点的距离。h(n)<=d(n)就又不会丢掉最优解,又可以中途就排除很多不行的答案。

bfs就是一个h(n)=0的A*搜索。。。。。(所有状态都会被加进去,错的离谱的也要)。。。。。

好感人。。。。

。。。说到哪了。。。。

如果俩个状态有n个不一样的地方,至少要走n-1步,这个估价函数相当好。

在这个程序具体实现中dep=d时,其实已经走了(d+1)步。。所以估价函数不用-1.

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. const int dx[]={2,1,-1,-2,-2,-1,1,2},dy[]={1,2,2,1,-1,-2,-2,-1};
  7.  
  8. char EndStatus[5][10] = {
  9. "11111",
  10. "01111",
  11. "00*11",
  12. "00001",
  13. "00000", };
  14.  
  15. struct Status {
  16. char a[5][6];
  17. int x,y;
  18.  
  19. bool operator ==(Status b) {
  20. for(int i=0;i<5;i++)
  21. for(int j=0;j<5;j++)
  22. if(a[i][j] != b.a[i][j]) return false;
  23. return true;
  24. }
  25.  
  26. int differ(Status b) {
  27. int res=0;
  28. for(int i=0;i<5;i++)
  29. for(int j=0;j<5;j++)
  30. if(a[i][j] != b.a[i][j]) res++;
  31. return res;
  32. }
  33.  
  34. Status step(int d) {
  35. Status res=*this;
  36. res.x=x+dx[d],res.y=y+dy[d];
  37. if(res.x<0 || res.x>4 || res.y<0 || res.y>4) return *this;
  38. swap(res.a[x][y],res.a[res.x][res.y]);
  39. return res;
  40. }
  41.  
  42. void get() {
  43. for(int i=0;i<5;i++) {
  44. scanf("%s",a[i]);
  45. for(int j=0;j<5;j++) if(a[i][j]=='*') {
  46. x=i; y=j;
  47. }
  48. }
  49. }
  50.  
  51. void get(char b[5][10]) {
  52. for(int i=0;i<5;i++)
  53. for(int j=0;j<5;j++) {
  54. a[i][j]=b[i][j];
  55. if(a[i][j]=='*') {x=i; y=j;}
  56. }
  57. }
  58. }Start,End,t;
  59. int lim,T;
  60.  
  61. bool dfs(int dep,Status s) {
  62. if(dep==lim) return s==End;
  63. for(int d=0;d<8;d++) {
  64. t=s.step(d);
  65. if(!(t==s) && dep+t.differ(End)<=lim) if(dfs(dep+1,t)) return true;
  66. }
  67. return false;
  68. }
  69.  
  70. int main() {
  71. End.get(EndStatus);
  72. scanf("%d",&T);
  73. while(T--) {
  74. Start.get();
  75. for(lim=0;lim<=15;lim++) if(dfs(0,Start)) break;
  76. printf("%d\n",lim>15 ? -1 : lim);
  77.  
  78. }
  79. return 0;
  80. }

1085: [SCOI2005]骑士精神的更多相关文章

  1. BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )

    一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* -------------------------------------------------------------- ...

  2. BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2838  Solved: 1663 [Submit][St ...

  3. Bzoj 1085: [SCOI2005]骑士精神 (dfs)

    Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...

  4. BZOJ(7) 1085: [SCOI2005]骑士精神

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3233  Solved: 1911[Submit][Stat ...

  5. 【BZOJ】1085: [SCOI2005]骑士精神(A*启发式搜索)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1085 囧啊囧,看了题解后写了个程序,但是样例总过不了T+T,调试了不下于1个小时,肉眼对拍看了根本看 ...

  6. bzoj 1085: [SCOI2005]骑士精神

    Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士,且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵 ...

  7. 1085. [SCOI2005]骑士精神【IDA※】

    Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2 ...

  8. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]

    题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...

  9. [BZOJ 1085][SCOI2005]骑士精神(IDA*)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1085 分析: 首先第一感觉是宽搜,但是空间需要8^15*5*5,明显不够,又鉴于最大深 ...

  10. 【BZOJ】1085: [SCOI2005]骑士精神

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1085 $${if (cs+val-1>ans) return ;}$$ #inclu ...

随机推荐

  1. Unity3D 利用NGUI2.6.3做技能冷却的CD效果

    转自http://blog.csdn.net/qqmcy/article/details/9469021 NGUI非常强大我们今天来学习一下,如何利用NGUI做技能冷却的CD效果.先导入NGUI的插件 ...

  2. Careercup - Facebook面试题 - 5188884744896512

    2014-05-02 07:18 题目链接 原题: boolean isBST(const Node* node) { // return true iff the tree with root 'n ...

  3. Query classification; understanding user intent

    http://vervedevelopments.com/Blog/query-classification-understanding-user-intent.html What exactly i ...

  4. InnoDB与UUID

    CakePHP本身有一个uuid实现,所以一直以来,我都在尝试使用uuid做主键的可能性.虽然MySQL是我最常用的数据库,但是和 auto_increment_int主键相比,我对uuid主键更有好 ...

  5. check environment var

    田+R cmd set XXX check environment var

  6. Ubuntu下非常给力的下载工具--uget+aria2

    转自Ubuntu下非常给力的下载工具--uget+aria2 Windows下的下载工具--迅雷,之所以下载速度快,乃是它能搜索资源.为己所用,而不是仅仅从原始地址这单一资源处下载. Ubuntu下也 ...

  7. Dijsktra算法C++实现

    Dijsktra算法解决了有向图G=(V,E)上带权的单源最短路径问题.但要求所有边的权值非负. 思想:Dijkstra算法中设置了一顶点集合S,从源点s到集合中的顶点的最终最短路径的权值均已确定.算 ...

  8. Javascript的9张思维导图学习

    思维导图小tips:思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ,它简单却又极其有效,是一种革命性的思维工具.思维导图运用图文并重的技巧,把各级主题的关系用相互隶属与相关的层级图表现出来 ...

  9. poj 3358 Period of an Infinite Binary Expansion

    由乘2取整得到分数的小数位,可以找到规律!!! 例如:1/10,2/10,4/10,8/10,16/10,32/10,64/10…… 取整后:1/10,2/10,4/10,8/10,6/10,2/10 ...

  10. C++primer中的TextQuery(读取文本)

    本题目对应于 C++primer(第四版)中 第十章的文本查询类(TextQuery) 用到的知识有: 顺序容器 vector 关联容器 set,map 标准输入输出流,文件流,字符串流 //写一个文 ...