数据结构课程实践2——隐式图的搜索问题(实验准备)
实验内容
3х3九宫棋盘,放置数码为1~8的8个棋子,棋盘中留有一个空格,空格周围的棋子可以移动到空格中,从而改变棋盘的布局。根据给定初始布局和目标布局,移动棋子从初始布局到达目标布局,求解移动步骤并输出。请设计算法,使用合适的搜索策略,在较少的空间和时间代价下找到最短路径。
编程语言以及开发环境的选择
编程语言:java
开发环境:IDE使用的是idea,jdk版本为1.8
实验思路
1、对九宫重排问题,建立图的启发式搜索求解方法;
2、用A*算法求解九宫重排问题。
一、设计思路
题目要求能到达目标图形的最少步数,首先想到了深度优先遍历(DFS),如果使用DFS,它的特点是尽可能先对纵深方向进行搜索,这种操作太过于盲目,很容易出现超时现象,相比较而言,使用A*算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法,算法中的距离估算值与实际值越接近,最终搜索速度越快。
1、输入
输入第一行包含九宫的初态,第二行包含九宫的终态。
本题的输入为:
2.3184765
1238.4765
2、输出
输出最少的步数,如果不存在方案,则输出-1。
3、公式
f(n)=g(n)+h(n)
f(n) 是从初始状态经由状态n到目标状态的代价估计
g(n) 是在状态空间中从初始状态到状态n的实际代价
h(n) 是从状态n到目标状态的最佳路径的估计代价
二、准备工作
1、我们要声明一个表memery来保存之前的状态
//memery用于保存之前状态,key代表状态字符串,value代表到key状态所用的最小步数
HashMap<String, Integer> memery = new HashMap<String, Integer>(100000);
2、由于采用了A*算法,那么应当是第一次能到达目标状态时,就是最少步数