用代码块功能插入代码,请勿粘贴截图
#include<iostream>;
#include<vector>;
using namespace std;
//竖着 Y 行数
#define ROWS 9
//横着 X 列数
#define COLS 11
#define ZXDJ 10
#define XXDJ 14
//点的类型
struct MyPoint
{
int row;
int col;
int f;
int g;
int h;
void setF()
{
f = g + h;
}
};
//树的节点类型
struct TreeNode
{
MyPoint pos; //当前点坐标
vector<TreeNode*> childs; //存储 当前点的孩子节点指针的数组
TreeNode* pParent; //存储 当前点的父节点指针的变量
};
enum direct
{
p_up,p_down, p_left, p_right,p_lup,p_ldown,p_rup,p_rdown
};
//打印地图
void printMap(int map[ROWS][COLS]);
//计算h值:endPos:终点坐标 pos:当前点坐标
int getH(MyPoint endPos, MyPoint pos);
//判断是否需要统计
bool needAdd(MyPoint pos, int map[ROWS][COLS], bool pathMap[ROWS][COLS]);
int main()
{
//1 构建地图 0->空地 1->障碍物
int map[ROWS][COLS] = {
{0,0,0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0},
};
//2 辅助地图 false:0->:没有走过 true:1->走过
bool pathMap[ROWS][COLS] = { 0 };
//3 起点 终点
MyPoint begPos = { 2,2 };
MyPoint endPos = { 4,8 };
//4 标记起点走过
pathMap[begPos.row][begPos.col] = true;
//5 创建一棵树,起点是树的根节点
//创建一个新节点
TreeNode* pNew = new TreeNode;
memset(pNew, 0, sizeof TreeNode);
//新节点成为树根
//pRoot一直指向树的根节点
TreeNode* pRoot = pNew;
//新节点是记录起点
pRoot->pos = begPos;
//6 需要一个动态数组 存储用来比较的节点
vector<TreeNode*> buff;
//7 寻路
//MyPoint currentPos = begPos;
TreeNode* pCurrent = pRoot;
TreeNode* pChild = NULL;
//迭代器
vector<TreeNode*>::iterator it;
vector<TreeNode*>::iterator itMin;
bool isFindEnd = false;
while (1)
{
//7.1 找到当前点周围能走的节点
for (int i = 0; i < 8; i++)
{
pChild = new TreeNode;
memset(pChild, 0, sizeof TreeNode);
pChild->pos = pCurrent->pos;
switch (i)
{
case p_up:
pChild->pos.row = pCurrent->pos.row - 1;
pChild->pos.g += ZXDJ;
break;
case p_down:
pChild->pos.row = pCurrent->pos.row + 1;
pChild->pos.g += ZXDJ;
break;
case p_left:
pChild->pos.col = pCurrent->pos.col - 1;
pChild->pos.g += ZXDJ;
break;
case p_right:
pChild->pos.col = pCurrent->pos.col + 1;
pChild->pos.g += ZXDJ;
break;
case p_lup:
pChild->pos.row = pCurrent->pos.row - 1;
pChild->pos.col = pCurrent->pos.col - 1;
pChild->pos.g += XXDJ;
break;
case p_ldown:
pChild->pos.row = pCurrent->pos.row + 1;
pChild->pos.col = pCurrent->pos.col - 1;
pChild->pos.g += XXDJ;
break;
case p_rup:
pChild->pos.row = pCurrent->pos.row - 1;
pChild->pos.col = pCurrent->pos.col + 1;
pChild->pos.g += XXDJ;
break;
case p_rdown:
pChild->pos.row = pCurrent->pos.row + 1;
pChild->pos.col = pCurrent->pos.col + 1;
pChild->pos.g += XXDJ;
break;
default:
break;
}
/*
测试
cout <<"(" << pChild->pos.row <<"," <<pChild->pos.col <<"),g:" <<pChild->pos.g << endl;
*/
//7.2 计算g h f的值
pChild->pos.h = getH(endPos, pChild->pos);
pChild->pos.setF();
//7.3 入树,入buff数组,标记走过
if (needAdd(pChild->pos, map, pathMap))
{
//入树
pCurrent->childs.push_back(pChild);
pChild->pParent = pCurrent;
//入buff数组
buff.push_back(pChild);
//标记走过
pathMap[pChild->pos.row][pChild->pos.col] = true;
}
else
{
delete pChild;
}
}
//7.4 从buff数组中找出f值最小的那个
itMin = buff.begin();
for (it = buff.begin(); it != buff.end(); it++)
{
if ((*itMin)->pos.f > (*it)->pos.f)
{
itMin = it;
}
}
//7.5 删掉,变化成当前点
pCurrent = *itMin;
buff.erase(itMin);
//7.6 判断是否寻路结束
if (pCurrent->pos.row == endPos.row && pCurrent->pos.col == endPos.col)
{
isFindEnd = true;
break;
}
if (buff.empty())
{
break;
}
}
if (isFindEnd)
{
cout << "找到终点了!!" << endl;
while (pCurrent)
{
cout << "(" << pCurrent->pos.row << "," << pCurrent->pos.col << ")";
pCurrent = pCurrent->pParent;
}
cout << endl;
}
printMap(map);
while (1);
return 0;
}
bool needAdd(MyPoint pos, int map[ROWS][COLS], bool pathMap[ROWS][COLS])
{
//判断是否在范围内
if (pos.row >= ROWS || pos.row < 0
|| pos.col >= COLS || pos.col < 0)
{
return false;
}
//判断是否走过
if (map[pos.row][pos.col]==1)
{
return false;
}
//判断是否为障碍物
if (pathMap[pos.row][pos.col] == true)
{
return false;
}
return true;
}
int getH(MyPoint endPos, MyPoint pos)
{
int x, y;
if (endPos.col > pos.col)
{
x = endPos.col - pos.col;
}
else
{
x = pos.col - endPos.col;
}
if (endPos.row > pos.row)
{
y = endPos.row - pos.row;
}
else
{
y = pos.row - endPos.row;
}
return(x + y) * ZXDJ;
}
void printMap(int map[ROWS][COLS])
{
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
if (map[i][j] == 0)
{
cout << " * ";
}
else
{
cout << " | ";
}
}
cout << endl << endl;
}
}
运行结果及报错内容