//用A*算法实现八数码问题
// 如:2 8 3 1 2 3 //0-2行,0-2列
// 1 6 4 ------》8 4
// 7 5 7 6 5
//A*算法,即设h为在位的数字个数,只有当h*<=h时才向下拓展
//重复以前动作为非法操作
#include<iostream.h>
#include<math.H >
#include<stdlib.h> //异常处理
class MatrixNode{
public:
int w; //不在位
int h; //牌与其目标位置直接步数之和
int g; //已经走的步数
int m; //在位的数字个数
int p; //牌与其目标位置直接步数之和
int f; //h+g
int place[3][3]; //当前矩阵
int placetrue[3][3]; //正确矩阵
int zeroplace[3][3]; //全0矩阵,移动时若为全零矩阵则移动无效
int kong_x; //空位的横坐标
int kong_y; //空位的纵坐标
//-------------------------------------------------------------------------------
public:
MatrixNode();
MatrixNode fuzhi(MatrixNode M_Matrix); //给第一个矩阵赋值;
int TruePlace(MatrixNode T_place ); // 查找在位数
int N_TruePlace(MatrixNode N_place ); // 查找在不位数
int p_place(MatrixNode P_place); //牌与其目标位置直接步数之和(坐标差之和为距离)
void printMatrix(const int Pri_Matrix[][3] );//输出矩阵
int f_kongx(MatrixNode find_kongx); //找出空位的x坐标
int f_kongy(MatrixNode find_kongy); //找出空位的y坐标
MatrixNode up_move(MatrixNode M_Matrix); //空格向上移动一格
MatrixNode down_move(MatrixNode M_Matrix); //空格向下移动一格
MatrixNode left_move(MatrixNode M_Matrix); //空格向左移动一格
MatrixNode right_move(MatrixNode M_Matrix); //空格向右移动一格
MatrixNode updata_m(MatrixNode M_Matrix); //移动后更新状态
bool PlaceAndZero(MatrixNode M_Matrix);//判断矩阵是否为零矩阵
bool mat_jug(MatrixNode M_Matrix1,MatrixNode M_Matrix2); //判断节点中的矩阵是否相同
};
// 如:2 8 3 1 2 3 //0-2行,0-2列
// 1 6 4 ------》8 4
// 7 5 7 6 5
//A*算法,即设h为在位的数字个数,只有当h*<=h时才向下拓展
//重复以前动作为非法操作
#include<iostream.h>
#include<math.H >
#include<stdlib.h> //异常处理
class MatrixNode{
public:
int w; //不在位
int h; //牌与其目标位置直接步数之和
int g; //已经走的步数
int m; //在位的数字个数
int p; //牌与其目标位置直接步数之和
int f; //h+g
int place[3][3]; //当前矩阵
int placetrue[3][3]; //正确矩阵
int zeroplace[3][3]; //全0矩阵,移动时若为全零矩阵则移动无效
int kong_x; //空位的横坐标
int kong_y; //空位的纵坐标
//-------------------------------------------------------------------------------
public:
MatrixNode();
MatrixNode fuzhi(MatrixNode M_Matrix); //给第一个矩阵赋值;
int TruePlace(MatrixNode T_place ); // 查找在位数
int N_TruePlace(MatrixNode N_place ); // 查找在不位数
int p_place(MatrixNode P_place); //牌与其目标位置直接步数之和(坐标差之和为距离)
void printMatrix(const int Pri_Matrix[][3] );//输出矩阵
int f_kongx(MatrixNode find_kongx); //找出空位的x坐标
int f_kongy(MatrixNode find_kongy); //找出空位的y坐标
MatrixNode up_move(MatrixNode M_Matrix); //空格向上移动一格
MatrixNode down_move(MatrixNode M_Matrix); //空格向下移动一格
MatrixNode left_move(MatrixNode M_Matrix); //空格向左移动一格
MatrixNode right_move(MatrixNode M_Matrix); //空格向右移动一格
MatrixNode updata_m(MatrixNode M_Matrix); //移动后更新状态
bool PlaceAndZero(MatrixNode M_Matrix);//判断矩阵是否为零矩阵
bool mat_jug(MatrixNode M_Matrix1,MatrixNode M_Matrix2); //判断节点中的矩阵是否相同
};