1379 八数码难题

这道题我本来想使用HASH+MAP来练练手,结果发现用A*+ID更简单
也就是说,这道题使用的是A算法+迭代加深算法进行一个估价函数和固定层数再加上优化的时间,来AC这一道题
首先,我们输入的这个起始状态用数组存储,不过记住目标状态的数组要多加一圈零,否则会导致移位时的越界现象,这样更加方便
然后进行一个特殊判断check也就是如果当前的起始状态和目标状态已经相等,就不必要进行下面的操作了
然后循环枚举搜索的深度,也就是迭代加深,接下来A
算法进行搜索
A*算法的搜索是一个关键,在这里我们设置的估计函数其实就是方位数组,每次都得也即是从上下左右的进行一个估价,如果当前状态加上估价值如果不越界,那么就将这两个位置换一下,进行递归,记得要回溯优化怎么办?
那么如何进行一个剪枝优化呢?只需要哦每次再搜索的时候,用一个flag标记,如果到头了就不用接下来算法,其实就是判断两个限制:一个是迭代的搜索层数,一个是搜索的九宫格只有行列为3,如果当前状态超出就没必要进行接下来的搜索了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
char ss[15];
int ans[4][4]=
{//目标状态 {0,0,0,0},{0,1,2,3},{0,8,0,4},{0,7,6,5}
};
int a[5][5];//初始状态
int k,flag;//k为深度  flag为标记
int dx[]={0,1,-1,0};
int dy[]={1,0,0,-1};//方位数组,也是估价函数 bool check()
{//特判函数 for(int i=1;i<=3;i++)for(int j=1;j<=3;j++){if(ans[i][j]!=a[i][j]) return 0;}return 1;
}
bool test(int step)
{//判断是否达到目标 int sum=0;for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){if(ans[i][j]!=a[i][j]&&++sum+step>k){return 0;}}}return 1;
}
void A_star(int step,int x,int y,int p)
{if(step==k)//搜索到头了 {if(check()) flag=1;return;}if(flag) return; //剪枝 for(int i=0;i<4;i++){int vx,vy;vx=x+dx[i],vy=y+dy[i];//估价步数 if(vx<1||vx>3||vy<1||vy>3||p+i==3) continue;//越界,不符合答案 swap(a[x][y],a[vx][vy]);//交换 if(test(step)&&flag==0) A_star(step+1,vx,vy,i);swap(a[x][y],a[vx][vy]);//回溯 }
}
int main()
{int x,y;//存储0的位置 cin>>ss;for(int i=0;i<9;i++){a[i/3+1][i%3+1]=ss[i]-'0';//存储 if(ss[i]-'0'==0) x=i/3+1,y=i%3+1; }if(check()){cout<<0<<endl;return 0;}while(++k)//扩大深度 {A_star(0,x,y,-1);//限制层数 if(flag) {cout<<k<<endl;break;}}return 0;}

1379 八数码难题相关推荐

  1. 洛谷 1379 八数码难题

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

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

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

  3. 【codevs1225】八数码难题,如何精确地搜索

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

  4. 洛谷P1379八数码难题

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

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

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

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

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

  7. 深度优先搜索解决八数码难题

    八数码问题 以前用java写的通过深度优先瘦素解决八数码难题. 对于八数码难题来说,可以把9宫格看成一个[3][3]的二维数组,将空格位置看成0,将0可以移动的方向看成树的枝丫,分为上下左右4个方向. ...

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

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

  9. 洛谷—P1379 八数码难题

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

最新文章

  1. oracle 数字不用,oracle – Plsql将数字(货币)拼写为意大利货币而不用硬编码的翻译编号...
  2. MarkDown 公式书写
  3. Node.js Promise.all 限制并发数量
  4. HTML+MYSQL+PHP搭建带有cookie的登陆页面
  5. 评审恩仇录——我为什么愿意执行代码评审
  6. jupyter notebook报错Failed to load module appmenu-gtk-module
  7. 列表_月隐学python第6课
  8. 神的战争god无法显示服务器,神的战争god快速升级抢资源攻略
  9. 讯飞超脑2030计划开启 持续引领人工智能未来发展
  10. 孙鑫VC学习笔记:第十讲画图 创建设置画笔的对话框 并且可以预览效果
  11. 中文字符集编码Unicode,gb2312,cp936,GBK,GB18030
  12. 海外服务器IP为什么被封以及解决方案
  13. Croe文件在线预览
  14. directx修复工具win7_[Win] DirectX修复工具 v3.8 增强版
  15. wps怎么只删除本页的页眉_WPS如何删除文件中某一页的页眉
  16. python可不可以开发软件_python可以开发软件吗
  17. Unity 制作数字图片字体
  18. js的2022年节假日数据包括法定节假日
  19. java实训报告心得体会,看这一篇就够了!
  20. 历经24小时,依靠全球定位,帮女朋友找回丢失的华为手机!

热门文章

  1. broadcom corporation BCM4313 linux驱动下载地址
  2. 1998考研阅读Text1翻译
  3. 数据结构实验报告(一)
  4. 使用数据库批量制作GTIN-14条码
  5. DM368 模块/模组 让办公更加便捷
  6. python0加到100_Python之0加到100
  7. python统计大小写字母个数_编写一个Python函数,它接受一个字符串并计算大写字母和小写字母的数量...
  8. 【英语语法】二、冠词
  9. 《计算机应用研究》投稿经历和时间节点
  10. Linux系统安装QWT