searcher.h

来自「滑块问题求解系统:利用深度优先搜索和广度优先搜索解决有趣的滑块问题求解系统。」· C头文件 代码 · 共 88 行

H
88
字号
#include <vector>
#include <queue>
#ifndef _SEARCHER_H_
#define _SEARCHER_H_

class HASH;
struct NODE{
	int status;    //状态
	int step;      //步长
	int val;       //估价值
	int father;    //父结点
	int zero;      //空格所在位置
};


const int MAXNODE = 182000;
extern HASH tree;
extern struct NODE open[MAXNODE];
extern int top;


class searcher{
protected:
	int ten[9];   //ten[] = {1,10,100,1000,10000,100000,1000000,10000000,100000000}
	int swap[9][9];   //状态转换用数组
	int dis[9][9];    //两数码之间的距离
	int des[9];	      //目标结点各个数码所在位置
	int m_end;        //结束状态
	int last_index;   //open表最后一个元素下标
	int expanded;     //已扩展的节点
	int inopen;       //仍在open表中的结点
	enum{NOANSWER, STOP, CANTFIND, SUCCESS}result;  //搜索结果
	int totalnode;   //搜索过的总节点数 - 1。
	double P;  //外显率  P = L / T;  L为路径长度, T为中间生成的节点总数。
	double B;  //有效分枝因数 T = B * (B ^ L - 1) / (B - 1); 可二分求解。

public:
	
	virtual int search(int begin, int end, int &stop, int val = 0) = 0;  //-1无解,-2用户终止,0找不到解,1有解
	virtual void getPath(std::vector<int> &vec);
	int reset(const int begin, const int end, int mode = 1);   //重置初始值,返回初始位置启发值		
	int getnextstatus(const int status, const int zero, const int zero_to){   //获取下一个状态
		return status + swap[zero][zero_to] * (status / ten[zero_to] % 10);		
	}
	virtual CString getIntroduction() = 0;  //介绍
	virtual CString getResult();     //获取搜索结果
	int getreverse(int status);  //逆序数	
	void getP(){  //获得外显率
		P = ( (double) open[last_index].step) / totalnode;
	}
	double getB();  //获得有效分枝因数
	int getStep(){return open[last_index].step;}   //解步长
	int getTotalnode(){return totalnode + 1;}   //总共生成节点数
};

class HASH{
protected:
	struct Node{
		int data;	
		struct Node* next;
	};
	const static int MAXSIZE= 70001, ALL = 182000;	
	int ID;
	struct Node *hash[MAXSIZE], node[ALL];
public:
	bool add(const int m_data);
	void reset(){   //重置哈希表
		memset(hash, 0, sizeof(hash) );
		ID = 0;
	}
};

const int dir_count[] = {2, 3, 2, 3, 4, 3, 2, 3, 2};
const int dir[][4] = {
	{1, 3, 0, 0},
	{0, 2, 4, 0},
	{1, 5, 0, 0},
	{0, 4, 6, 0},
	{1, 3, 5, 7},
	{2, 4, 8, 0},
	{3, 7, 0, 0},
	{4, 6, 8, 0},
	{5, 7, 0, 0}
};



#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?