📄 pushboxai.h
字号:
/*
* CACIter:用于记录结点访问状态的辅助模板类。TNodeKey为唯一确定当前状态的哈希值类型,应当是一个struct。
* 三种状态是:nsNone:无或不在结点访问状态表中;nsVisiting:正在访问;nsDead:已死亡
*/
#if !defined(AI__INCLUDED_)
#define AI__INCLUDED_
#include "stdafx.h"
#include "conio.h"
#include <map>
#include <vector>
/* 地图最大宽度和高度 */
#define MAXMAPWIDTH 40
#define MAXMAPHEIGHT 40
/* 假定最多有6个箱子 */
#define MAXBOXCOUNT 6
/* 地图上几种元素:空格表示空地,X表示阻挡物,?表示箱子移动的目的地,O表示箱子的起始位置,*表示人的起始位置 */
#define MAP_EMPTY ' '
#define MAP_BLOCK 'X'
#define MAP_HOLE '?' // target position
#define MAP_BOX 'O' // box start position(internal use)
#define MAP_MAN '*' // man start position(internal use)
/* 当前状态。x,y为人的位置,boxx[],boxy[]为箱子的位置。假定最多有6个箱子 */
typedef struct
{
// man pos
char x, y;
char boxx[MAXBOXCOUNT], boxy[MAXBOXCOUNT];
}_PushStatus;
typedef enum
{
trFailed,
trUnknown,
trSuccess
}TryResult;
/* 工作类 */
class CPushBoxAI
{
public:
/* 记录当前工作路径的数组,记录最短成功路径的数组 */
std::vector<_PushStatus> m_vStepLog, m_vSuccLog;
/* 地图,其中不包含人和箱子 */
char m_Map[MAXMAPWIDTH][MAXMAPHEIGHT];
/* 地图宽高、箱子数量、最短成功路径 */
int m_nWidth, m_nHeight, m_nBoxCount, m_nMinSteps;
/* 初始化地图和初始状态 */
void Init(_PushStatus& status);
/* 尝试下一个方向。status是当前状态,level是下一个方向的深度(步数),dx,dy指出下一个方向 */
TryResult TryDir(_PushStatus status, int level, int dx, int dy);
/* 求解 */
bool Execute(void);
/* 打印当前状态下的地图 */
void DumpMaze(_PushStatus status);
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -