luogu P1379 八数码难题(A*算法入门详细讲解)
代码实现细节
#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*算法入门详细讲解)相关推荐
- 洛谷—P1379 八数码难题
题目链接:P1379 八数码难题 题目大意: 要求最少步骤的移动方法,实现从初始布局到目标布局的转变. 解题思路: 这道题目要用到搜索中比较难的搜索方法-迭代加深的A*算法.所谓迭代加深就是每次限制搜 ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- [洛谷] P1379 八数码难题( 提高+/省选- )
八数码 1.题目 2.分析 3.代码 1. bfs (+queue) + unordered_map 重点分析 2.双向bfs (适用于知道起始状态的情况) 思路分析 3.双向bfs优化 思路 4.总 ...
- P1379 八数码难题 题解(双向宽搜)
博客园同步 原题链接 简要题意: 给定一个 3 × 3 3 \times 3 3×3 的矩阵,每次可以把空格旁边(四方向)的一个位置移到空格上.求到目标状态的最小步数. 前置知识: 单向宽搜的写法 O ...
- 【洛谷】P1379 八数码难题
题目地址: https://www.luogu.com.cn/problem/P1379 题目描述: 在3×33×33×3的棋盘上,摆有八个棋子,每个棋子上标有111至888的某一数字.棋盘中留有一个 ...
- IDA*-洛谷P1379 八数码难题
https://daniu.luogu.org/problem/show?pid=1379 省选的收获 暗金 学会了A*啦啦啦: 我在第一天学了A*; 然后回家颓废之余思考思考: 又问了van爷一些小 ...
- 洛谷OJ:P1379 八数码难题(双向搜索)
思路:相信不少小伙伴上来就是暴力DFS,但是拿到题之后我们不妨想一想如果纯DFS爆搜下来会产生多少种状态,这样的方法是否是最优的? 这里选择使用一种称之为双向搜索的方法(通过知乎学到的,放出来shar ...
- 8puzzle java 代码_八数码难题(8 puzzle)深度优先和深度优先算法
1搜索策略 搜索策略是指在搜索过程中如何选择扩展节点的次序问题.一般来说,搜索策略就是采用试探的方法.它有两种类型:一类是回溯搜索,另一类是图搜索策略. 2盲目的图搜索策略 图搜索策略又可分为两种:一 ...
- 利用Python求解八数码难题
实验目的 实验内容 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格,与空格相邻的棋子可以移到空格中.要求解决的问题 ...
- 八数码难题的多种解法
蔡自兴老师的<人工智能及其应用>这本书的第3章里面讲解了很多种搜索方法,因为看的不是很懂,所以网上就找了资源来帮助理解. 为了帮助各位更好的理解,在此,仅以八数码难题为实例来解释说明. # ...
最新文章
- 读大叔深入理解javascript(2)
- SVN分支与合并【超详细的图文教程】(转载)
- java.net.Socket 解析
- MySQL 高级repeat循环
- Visual Studio 2008 每日提示(四)
- Bash脚本:怎样一行行地读文件(最好和最坏的方法)
- mysql 与 xls 连接_数据库MySQL与xls文件的互导
- vue 源码学习(一) 目录结构和构建过程简介 1
- tcpdump工具编译记录
- 一道『easy』等级的力扣题,我写了两个小时的笔记...
- java index.jsp为什么不默认跳转_Java开发人员怎么面试 常见Redis面试题有哪些
- Java 泛型 (generics) 的使用
- SQLsever --数据库置疑
- linux中权限编号,linux体系常用指令-用户及权限管理.ppt
- 如何下载Eclipse?
- RAM Parity 和 RAM ECC
- verilog 中的可综合与不可综合
- 让横向纵向分辨率都一致
- 内存取证常见例题思路方法-volatility (没有最全 只有更全)
- SAP现金管理(Cash Management)的常见问题
热门文章
- .ajax 上传图片,ajax图片上传并预览
- java file util_Java FileUploadUtil工具类详解
- mysql闩_MySQL锁概述
- vue.js 多页 php,vue-cli创建的项目,配置多页面的实现方法
- 更改自定义按钮显示值并对单元格赋值
- pca百分比取多少比较好_防晒霜指数多少比较好?防晒霜SPF多少够用
- springBoot于tomcat7搭建websocket服务
- SQL Server内存
- 遗传算法的基本概念和实现(附 Java 实现案例)
- 能源行业将被重构,大数据有哪些“挖”法?