/*
八数码问题求解
输入输出都是随机生成
open表为优先队列pQueue
close表为键值对容器hashx
八数码状态有解的情况为起始和目标状态的排成一行后的逆序数的奇偶性相同
启发函数采用计算当前状态和目标状态的哈夫曼距离
*/
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<string.h>
using namespace std;
#define abs(x) ((x)>0?(x):-(x))
int direction[4][2]={-1,0,0,1,1,0,0,-1};
int cost[9][2];//代价
bool inverse=false;
struct Eight
{
int num[3][3];//状态
int hash;//哈希值
int deep;//深度
int hValue;//估价值
int pre;//父亲节点
bool inQueue;
bool operator < (const struct Eight &a) const//比较函数
{
return a.hValue<hValue;
}
void value()//计算估价值
{
hValue=deep;
for(int i=0;i<9;++i)
{
hValue+=abs(i/3-cost[num[i/3][i%3]][0]);
hValue+=abs(i%3-cost[num[i/3][i%3]][1]);
}
}
void getHash()//计算哈希值
{
hash=num[0][0];
for(int i=1;i<9;++i)
{
八数码问题
最新推荐文章于 2018-01-16 21:34:27 发布