代码实现细节

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=10;
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
int flag,now[N],goal[N];
int dis[N][N],a[N][N],mp[N][N];
inline int calcx(int x){return (x-1)/3+1;}
inline int calcy(int x){return x%3?x%3:3;}
inline int abs(int x){return x>0?x:-x;}
inline int h(){int t=0;for(int i=1;i<=9;i++) t+=dis[now[i]][goal[i]];return t;}
inline int check(){for(int i=0;i<9;i++) if(now[i]!=goal[i]) return 0;return 1;}
void dfs(int depth,int x,int y,int lim){if(depth+h()>lim) return ;if(check()){flag=1;return ;}for(int i=0,nx,ny;i<4;i++){nx=x+dx[i];ny=y+dy[i];if(flag) return ;if(nx>0&&nx<=3&&ny>0&&ny<=3){swap(a[x][y],a[nx][ny]);swap(now[a[x][y]],now[a[nx][ny]]);dfs(depth+1,nx,ny,lim);swap(a[x][y],a[nx][ny]);swap(now[a[x][y]],now[a[nx][ny]]);}}
}
void pre(){for(int i=1;i<=9;i++)for(int j=i+1;j<=9;j++)dis[i][j]=dis[j][i]=calcx(j)-calcx(i)+abs(calcy(j)-calcy(i));
}
int main(){pre();goal[0]=5;goal[1]=1;goal[2]=2;goal[3]=3;goal[4]=6;goal[5]=9;goal[6]=8;goal[7]=7;goal[8]=4;int sx,sy;for(int i=1,x,y,z;i<=9;i++){scanf("%1d",&z);x=calcx(i);y=calcy(i);mp[x][y]=z;now[z]=i;if(!z) sx=x,sy=y;}for(int i=0;;i++){memcpy(a,mp,sizeof mp);dfs(0,sx,sy,i);if(flag){printf("%d\n",i);break;}}return 0;
}

转载于:https://www.cnblogs.com/shenben/p/6699383.html

luogu P1379 八数码难题(A*算法入门详细讲解)相关推荐

  1. 洛谷—P1379 八数码难题

    题目链接:P1379 八数码难题 题目大意: 要求最少步骤的移动方法,实现从初始布局到目标布局的转变. 解题思路: 这道题目要用到搜索中比较难的搜索方法-迭代加深的A*算法.所谓迭代加深就是每次限制搜 ...

  2. 洛谷P1379八数码难题

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

  3. [洛谷] P1379 八数码难题( 提高+/省选- )

    八数码 1.题目 2.分析 3.代码 1. bfs (+queue) + unordered_map 重点分析 2.双向bfs (适用于知道起始状态的情况) 思路分析 3.双向bfs优化 思路 4.总 ...

  4. P1379 八数码难题 题解(双向宽搜)

    博客园同步 原题链接 简要题意: 给定一个 3 × 3 3 \times 3 3×3 的矩阵,每次可以把空格旁边(四方向)的一个位置移到空格上.求到目标状态的最小步数. 前置知识: 单向宽搜的写法 O ...

  5. 【洛谷】P1379 八数码难题

    题目地址: https://www.luogu.com.cn/problem/P1379 题目描述: 在3×33×33×3的棋盘上,摆有八个棋子,每个棋子上标有111至888的某一数字.棋盘中留有一个 ...

  6. IDA*-洛谷P1379 八数码难题

    https://daniu.luogu.org/problem/show?pid=1379 省选的收获 暗金 学会了A*啦啦啦: 我在第一天学了A*; 然后回家颓废之余思考思考: 又问了van爷一些小 ...

  7. 洛谷OJ:P1379 八数码难题(双向搜索)

    思路:相信不少小伙伴上来就是暴力DFS,但是拿到题之后我们不妨想一想如果纯DFS爆搜下来会产生多少种状态,这样的方法是否是最优的? 这里选择使用一种称之为双向搜索的方法(通过知乎学到的,放出来shar ...

  8. 8puzzle java 代码_八数码难题(8 puzzle)深度优先和深度优先算法

    1搜索策略 搜索策略是指在搜索过程中如何选择扩展节点的次序问题.一般来说,搜索策略就是采用试探的方法.它有两种类型:一类是回溯搜索,另一类是图搜索策略. 2盲目的图搜索策略 图搜索策略又可分为两种:一 ...

  9. 利用Python求解八数码难题

    实验目的 实验内容 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格,与空格相邻的棋子可以移到空格中.要求解决的问题 ...

  10. 八数码难题的多种解法

    蔡自兴老师的<人工智能及其应用>这本书的第3章里面讲解了很多种搜索方法,因为看的不是很懂,所以网上就找了资源来帮助理解. 为了帮助各位更好的理解,在此,仅以八数码难题为实例来解释说明. # ...

最新文章

  1. 读大叔深入理解javascript(2)
  2. SVN分支与合并【超详细的图文教程】(转载)
  3. java.net.Socket 解析
  4. MySQL 高级repeat循环
  5. Visual Studio 2008 每日提示(四)
  6. Bash脚本:怎样一行行地读文件(最好和最坏的方法)
  7. mysql 与 xls 连接_数据库MySQL与xls文件的互导
  8. vue 源码学习(一) 目录结构和构建过程简介 1
  9. tcpdump工具编译记录
  10. 一道『easy』等级的力扣题,我写了两个小时的笔记...
  11. java index.jsp为什么不默认跳转_Java开发人员怎么面试 常见Redis面试题有哪些
  12. Java 泛型 (generics) 的使用
  13. SQLsever --数据库置疑
  14. linux中权限编号,linux体系常用指令-用户及权限管理.ppt
  15. 如何下载Eclipse?
  16. RAM Parity 和 RAM ECC
  17. verilog 中的可综合与不可综合
  18. 让横向纵向分辨率都一致
  19. 内存取证常见例题思路方法-volatility (没有最全 只有更全)
  20. SAP现金管理(Cash Management)的常见问题

热门文章

  1. .ajax 上传图片,ajax图片上传并预览
  2. java file util_Java FileUploadUtil工具类详解
  3. mysql闩_MySQL锁概述
  4. vue.js 多页 php,vue-cli创建的项目,配置多页面的实现方法
  5. 更改自定义按钮显示值并对单元格赋值
  6. pca百分比取多少比较好_防晒霜指数多少比较好?防晒霜SPF多少够用
  7. springBoot于tomcat7搭建websocket服务
  8. SQL Server内存
  9. 遗传算法的基本概念和实现(附 Java 实现案例)
  10. 能源行业将被重构,大数据有哪些“挖”法?