题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

  1. 283104765
输出样例#1:

  1. 4

  1.  
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<cmath>
  5. using namespace std;
  6.  
  7. //目标态
  8. int fin[][]={{,},{,},{,},{,},{,},{,},{,},{,},{,}};
  9.  
  10. struct State{
  11. int a[][];
  12. };
  13.  
  14. int lim=,ok;
  15.  
  16. //计算f(n)函数
  17. int H(const State &st){
  18. int ret=;
  19. for(int i=;i<;i++)
  20. for(int j=;j<;j++){
  21. int t=st.a[i][j];
  22. if(t) ret+=abs(fin[t][]-i)+abs(fin[t][]-j);
  23. }
  24. return ret;
  25. }
  26.  
  27. void dfs(State st,int g){
  28. int h=H(st);
  29. if(ok||g+h>lim)
  30. return;
  31. if(!h){
  32. ok=;
  33. return;
  34. }
  35. int x,y;
  36. for(int i=;i<;i++)
  37. for(int j=;j<;j++)
  38. if(!st.a[i][j]){
  39. x=i,y=j;
  40. break;
  41. }
  42. if(x>){
  43. swap(st.a[x][y],st.a[x-][y]);
  44. dfs(st,g+);
  45. swap(st.a[x][y],st.a[x-][y]);
  46. }
  47. if(x<){
  48. swap(st.a[x][y],st.a[x+][y]);
  49. dfs(st,g+);
  50. swap(st.a[x][y],st.a[x+][y]);
  51. }
  52. if(y>){
  53. swap(st.a[x][y],st.a[x][y-]);
  54. dfs(st,g+);
  55. swap(st.a[x][y],st.a[x][y-]);
  56. }
  57. if(y<){
  58. swap(st.a[x][y],st.a[x][y+]);
  59. dfs(st,g+);
  60. swap(st.a[x][y],st.a[x][y+]);
  61. }
  62. }
  63.  
  64. int main(){
  65. State st;
  66. char ch[];
  67. scanf("%s",ch);
  68. for(int i=;i<;i++)
  69. for(int j=;j<;j++)
  70. st.a[i][j]=ch[i*+j]-'';
  71. while(++lim){
  72. dfs(st,);
  73. if(ok) break;
  74. }
  75. printf("%d\n",lim);
  76. return ;
  77. }

  1. 在写盲目bfs 1590ms 后很久才用的IDA*解法
  1. 感谢will7101luogu上题解给本蒟蒻此题IDA*稍短代码的启蒙
  1. 终于学会了计算h(n) QwQ
  1.  

总是在梦里我看到你无助的双眼  我的心又一次被唤醒
  1.  

luoguP1379 八数码难题[启发式搜索]的更多相关文章

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

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

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

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

  3. Codevs 1225 八数码难题

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

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

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

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

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

  6. 洛谷P1379八数码难题

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

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

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

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

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

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

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

随机推荐

  1. HTML----网页基础和基本标签

    网页分类: 1.静态网页:所有内容全写死,都写在源代码中,若修改必须修改源代码,后缀为.html或htm 2.动态网页:内容大部分来自于数据库,可以修改,后缀为.aspx(c#).jsp(java). ...

  2. RSA加密算法

    class Program { static void Main(string[] args) { RSAPublicKey P = new RSAPublicKey(); P.Exponent = ...

  3. 简化布隆过滤器——BitMap

    简化布隆过滤器--BitMap 前言 前段开发项目试就发现,一部分的代码实现存在着一些性能上的隐患.但当时忙于赶进度和由于卡发中的不稳定因素,想了许多解决方案也没有机会实施.最近,正好趁个机会进行一系 ...

  4. 用excel公式生成有规律的代码,减少编程工作量

    1.在excel中如何输入公式 在excel表格中输入 & 符号是字符串的连接符,比如: 在excel表格中输入  ="sherlock"&"mina&q ...

  5. placeholder属性兼容ie8

    <!doctype html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. 使用 bufferedreader 的好处

    简单的说,一次IO操作,读取一个字节也是读取,读取8k个字节也是读取,两者花费时间相差不多.而一次IO的来回操作却要耗费大量时间.好比是一辆大型汽车(设装100人),要去车站接人到公司,接一个人也是接 ...

  7. Go - method

    hello, 大家好,由于之前工作上面的事情较多,所以关于go语言的学习就暂时“搁浅了”...不过从今天开始,我们又将回到了go语言的学习过程之中. 当然,我们学习go的"初心"是 ...

  8. Idea 常用功能汇总,工作中常用技巧

    1.隐藏没用到的文件 比如 IDEA 的项目配置文件(.iml 和.idea),打开 Settings-File Types, 加入要隐藏的文件后缀.  2.常用技巧 2.1 通过Alt+F8查看变量 ...

  9. ionic 项目中添加modal的步骤流程

    1.首先在templates文件夹下面定义一个新页面,xxx.html,template文件夹在空项目里面是没有的,需要手动添加一个,放在WWW文件夹下面. <ion-modal-view> ...

  10. Django 模型和数据库 总结

    模型和数据库 模型 首先我们在创建一个model的时候,这个类都是继承自 django.db.models.Model, 各种Model Field类型 AutoField,自动增长的IntegerF ...