实验内容
-
对九宫重拍问题,建立图的启发式搜索求解方法
-
用A*算法求解九宫重拍问题
实验目标
-
3x3九宫棋盘,放置数码1~8的8个棋子,棋盘中留有一个空格,空格周围的棋子可以移动到空格中,从而改变棋盘的布局。
-
根据给定初始布局和目标布局,移动棋子从初始布局达到目标定居,求解移动步骤并输出。
编程语言和开发环境
-
由于对InteliJ IDEA比较熟悉,所系编程环境选择IntelliJ IDEA;
-
编程语言选择JAVA
实验思路
1、存储初始和目标方格状态
-
创建二维链表
star
用来存储方格初始状态 -
创建二维链表
Final
用来存储目标方格状态
2、创建三个三维链表
-
创建三维链表
Close
,用来存储每次比较H(x)值最小的二维链表 -
创建三维链表
Open
,用来存储未放进Close
链表的二维链表 -
创建一个二维链表
Open_0
,用来存储对应Open
链表中H(x)的值和对应二维表的下标
3、函数的创建
-
创建
Next_Stemp
函数,用来判断0值下一步可以移动的方向; -
创建函数
faction1
,判断移动后的方格是否为目标方格; -
创建函数
faction2
,判断移动后的方格是否出现在Open
链表和Close
链表中 -
创建
insert
函数,将下一步未出现在Open
链表和Close
链表中的情况存储在Open
表中
实现的原理
-
将初始状态和目标状态录入,将初始状态存储在
Open
链表中 -
计算
Open
链表中所有表格的H(X)的值; -
将H(X)值最小的表格存储到
Close
表格中,并从Open
表中移除; -
将第三步移入
Close
表格中的表格,求出下一步可以移动的方向即移动后的情况 -
比较移动后的情况,如果说移动后的表格为目标表格,则结束,如果移动后的表格不是目标表格也不在
Open
链表和Close
链表中,则将移动后的表格放入Open
链表中,重复第2步骤