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. Ubuntu 14.04 64位上配置JDK操作步骤
  2. Apache启动报错
  3. EIGRP协议邻居详解及故障实战分析
  4. Spring MVC HelloWorld入门及运行机制 (一)
  5. SQL--Chapter8--Working with Triggers and Transactions
  6. 计算机组成原理电子时钟设计与实现,《计算机组成原理》课程设计报告-基于VHDL数字电子钟设计与实现.doc...
  7. Java之Normalizer(归一化)
  8. 2016级算法第五次上机-C.Bamboo和Coco
  9. 与用户交互、格式化输出、基本运算符
  10. oracle jde优势介绍,JDE 的扫盲知识介绍。。。
  11. Unity Plastic SCM (无法托管/当前仓库地址错误/创建新项目无法托管/由于目标计算机积极无法连接)
  12. oracle varchar2(n) 与 postgresql varchar(n) 的区别
  13. Python实现简单自动升级exe程序版本并自动运行
  14. 嵌入式单片机基础篇(五)之stm32F1以及51单片机时钟详解
  15. STM32单片机的优缺点分析
  16. windows打开cmd的几种方式
  17. 简单例子学习理解Rough Set的范畴概念
  18. 曲率、曲率圆和曲率半径
  19. 写一个可以一键统一调整word文档格式的程序
  20. bat脚本--android adb一键截图

热门文章

  1. import skimage报错ImportError: numpy.core.multiarray failed to import解决
  2. java代码重构原则_重构原则
  3. 考拉海购offer入手,分享一波面经(网易内推技术岗)。
  4. 怎样把电脑图片粘贴到准考证上
  5. 一款可以客户编程的汽车级开关霍尔芯片介绍-CH481
  6. 驱动调试(三)oops确定函数PC
  7. Java 集合的有序和无序总结
  8. 有登陆认证的情况下如何使用Wisdom RESTClient?
  9. 出借资质的被挂靠人无权向发包人主张工程款
  10. 数据结构04:静态链表