八数码难题
3×3九宫棋盘,放置数码为1 - 8的8个棋牌,剩下一个空格,只能通过棋牌向空格的移动来改变棋盘的布局。
求解的问题——给定初始布局(即初始状态)和目标布局(即目标状态),如何移动棋牌才能从初始布局到达目标布局
解答路径——就是一个合法的走步序列
用宽度优先搜索方法解决该问题:
为问题状态的表示建立数据结构:3×3的一个矩阵,
* 矩阵元素S ij∈{
0,1,…,8};其中1≤i,j≤3,
* 数字0指示空格,
* 数字1 - 8指示相应棋牌。
初始状态S0: 2 3 目标状态Sg: 1 2 3
1 8 4 8 0 4
7 6 5 7 6 5
制定操作算子集:
* 直观方法——为每个棋牌制定一套可能的走步:左、上、右、下四种移动。这样就需32个操作算子。
*简易方法——仅为空格制定这4种走步,因为只有紧靠空格的棋牌才能移动。
* 空格移动的唯一约束是不能移出棋盘。
**************************************** A*算法应用 *****************************************************
估价函数:f(n)=d(n)+w(n)
其中:d(n)为n的深度 w(n)为不在位的棋子数
根据f(n)的大小全局择优搜索
取h(n)=w(n),则有w(n)≤h*(n),h(n)满足A*算法的限制条件
在编程中注意:
1:深度和前驱节点的记录。(队列队首元素和队尾元素的下标的作用。)
2:采用宽度优先搜索,再根据A*算法,从open表中选出相对函数值最小的节点进行拓展。
注意深度优先搜索不适合,可能选择的一个分支到最后无解。
3:递归算法应用
*/
以下是代码:
#include<iostream>
#include<cstdlib>
#define N 1000
using namespace std;
int sum=0;
int head=0,step=0;
int m=0,ta=0;
int zuixiao[N];
char cdir[4]={
'u','r','d','l'};// 方向对应字母
char opcdir[4]={
'd','l','u','r'};//反方向对应字母
const int aim_state[9]={
1,2,3,8,0,4,7,
八数码游戏(启发式搜索A*算法)
最新推荐文章于 2021-10-15 10:31:24 发布