题目描述 Description

Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.
问题描述

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

输入描述 Input Description

输入初试状态,一行九个数字,空格用0表示

输出描述 Output Description

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)

样例输入 Sample Input

283104765

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

详见试题

!!!!!!!!:在对着别人的程序编就剁手!!!!!
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. int c[]={,,,,,,,,};
  6. char mb[]={,,,,,,,,};
  7. int dict2[]={,,,-},
  8. dict1[]={-,,,};
  9. bool used[],sign;
  10. int www;
  11. int step[];
  12. char q[][];
  13. int steps;
  14. int hash(char str[])
  15. {
  16. int i,j,k;
  17. int f[];
  18. int sum=;
  19. memset(f,,sizeof(f));
  20. for (i=;i<;i++)
  21. {
  22. k=;
  23. for (j=;j<;j++)
  24. if (j<str[i] && !f[j])
  25. k++;
  26. f[str[i]]=;
  27. sum+=k*c[-i];
  28. }
  29. return sum;
  30. }
  31. void bfs()
  32. {
  33. int i,j,h,t;
  34. int x1,y1,z1,cx,cy,cz;
  35. memset(used,,sizeof(used));
  36. memset(step,,sizeof(step));
  37. www=hash(q[]);
  38. used[www]=;
  39. h=;
  40. t=;
  41. while (h<t)
  42. {
  43. sign=;
  44. for (i=;i<;i++)
  45. if (q[h][i]!=mb[i])
  46. {
  47. sign=;
  48. break;
  49. }
  50.  
  51. if (!sign)
  52. {
  53. steps=step[h];
  54. return;
  55. }
  56.  
  57. for (i=;i<;i++)
  58. if (q[h][i]==)
  59. {
  60. x1=i/;
  61. y1=i%;
  62. z1=i;
  63. break;
  64. }
  65. for (i=;i<;i++)
  66. {
  67. cx=x1+dict1[i];
  68. cy=y1+dict2[i];
  69. cz=cx*+cy;
  70. if ((cx>=) && (cx<) && (cy>=) && (cy<))
  71. {
  72. for (j=;j<;j++)
  73. q[t][j]=q[h][j];
  74. q[t][z1]=q[h][cz];
  75. q[t][cz]=;
  76. www=hash(q[t]);
  77. if (!used[www])
  78. {
  79. used[www]=;
  80. step[t]=step[h]+;
  81. t++;
  82. }
  83. }
  84. }
  85. h++;
  86. }
  87. steps=-;
  88. return;
  89. }
  90. int main()
  91. {
  92. int i;
  93. char in[];
  94. scanf("%s",in);
  95. for (i=;i<;i++)
  96. q[][i]=in[i]-''+;
  97. bfs();
  98. printf("%d",steps);
  99. return ;
  100. }

【CodeVS】 p1225 八数码难题的更多相关文章

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

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

  2. Codevs 1225 八数码难题

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

  3. [luogu]P1379 八数码难题[广度优先搜索]

    八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...

  4. 洛谷P1379八数码难题

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

  5. 洛谷 P1379 八数码难题 解题报告

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

  6. 【洛谷P1379】八数码难题(广搜、A*)

    八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...

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

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

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

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

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

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

随机推荐

  1. 数据库递归查询-CTE

    1.公用表表达式(CTE)的定义 公用表达式的定义包含三部分: 公用表表达式的名字(在WITH之后) 所涉及的列名(可选) 一个SELECT语句(紧跟AS之后), 公用表表达式的好处之一是可以在接下来 ...

  2. 【PHP&&MySQL详解】

    PHP和MySQL是一对好搭档,PHP中有一个很大的扩展库专门针对对MySQL的操作.当然,作为一个PHP程序员,首先对MySQL的增删查改要非常熟悉才行. MySQL数据库的连接数大概在6w个左右, ...

  3. go sample - mongodb

    简单的mongodb 操作 package mainimport ( "fmt" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2 ...

  4. VMware报错:“device eth0 does not seem to be present, delaying initialization ”

    转自:http://blog.sina.com.cn/s/blog_77126fa501018s3d.html vmlite虚拟机启动出错,就把这个虚拟机删除掉重新建立,系统虚拟硬盘使用之前的,启动系 ...

  5. 【转】Struts2中json插件的使用

    配置注意点: 在原有Struts2框架jar包的引入下,需要额外多加一个Json的插件包(struts2-json-plugin-2.3.7.jar) 在struts.xml配置文件中,包需要继承js ...

  6. loadrunner统计字符串中指定字符出现的次数

    Action() { char *str="sdfas1,sdfsdf2,sdfsdfsdfdsf3,sdfsdfsdfsdfds4,fsdfdsf5,sdfdsfsd6,fsdfsd7sd ...

  7. hdu 2546 饭卡 删除一个数的01背包

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  8. Liferay 6.2 改造系列之五:修改默认站点的页面内容

    相关页面可以通过/portal-master/portal-impl/src/portal.properties文件配置进行修改: 登录页: ## ## Default Landing Page ## ...

  9. uva624 01背包要求输出路径

    You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is o ...

  10. hdu1010 dfs+奇偶性减枝

    Tempter of the Bone Problem Description The doggie found a bone in an ancient maze, which fascinated ...