关于DFS使用栈,链表处理最短路径问题
文章仅供学习,存在BUG
正常运行没问题
代码很水,不喜勿喷 o.o
第一次,请只运行下方代码,因为还未把数据放入文件中
//把数据写入文件中
int row = 10, col = 10;
int GameMap[10][10] =
{
{
1, 0, 1, 1, 1, 1, 1, 1, 1, 1 },
{
1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{
1, 0, 1, 1, 1, 1, 1, 0, 1, 1 },
{
1, 0, 1, 0, 1, 0, 0, 0, 1, 1 },
{
1, 0, 1, 0, 1, 0 ,1, 0, 1, 1 },
{
1, 0, 0, 0, 0, 0, 1, 0, 0, 1 },
{
1, 0, 1, 0, 1, 0, 1, 0, 1, 1 },
{
1, 0, 1, 0, 1, 0, 1, 1, 1, 1 },
{
1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{
1, 1, 1, 1, 1, 1, 1, 1, 0, 1 },
};
FILE *pchar = fopen("3.Map", "wb");
fwrite(&row, sizeof(int), 1, pchar);
fwrite(&col, sizeof(int), 1, pchar);
for (int i = 0; i < row; i++)
{
fwrite(GameMap[i], sizeof(int)*col, 1, pchar);
}
fclose(pchar);
Main.cpp
#include<iostream>
#include <stack>
#include <list>
#include <windows.h>
#include "CMyPoint.h"
#include "GameMap.h"
using namespace std;
/*
作业-- - 考虑路径带环
3.找到最短路径.
思路:
找到所有路径然后全部放入MinPathList中
每条路径的有EndPoint区分开来
第一条路径大于第二条路径时候,删除第一条
当第二条路大于第一条路径的时候删除第二条
直到只剩一条路径,输出路径以及size
*/
CMyPoint *Near[4] =
{
new CMyPoint(1, 0),
new CMyPoint(-1, 0),
new CMyPoint(0, -1),
new CMyPoint(0, 1)
};
//开始的地方
CMyPoint StartPoint = {
0, 1 };//stack上一个节点
CMyPoint LastPathPoint;//记录stack的最后一个节点
CMyPoint EndPoint = {
9, 8 };//胜利点
bool IsDeadEnd = false;//是否是死胡同
bool IsVictory = false;//是否已经胜利
//使用栈来实现DFS
stack<CMyPoint> pathStack;//删节点(正常运行)
list <CMyPoint> MinPathList;//所有路径存放的链表
list <CMyPoint> LastPathList;//每条寻路最后的路径
list<CMyPoint> TempList;//临时链表,存储栈内元素
//从文件中读取数据
CGameMap *gameMap = new CGameMap("3.Map");//地图初始化
void PushStack(CMyPoint pointTemp)
{
//判断该点周围四个点是否可以过
for (int i = 0; i < 4; i++)
{
int xTemp = pointTemp.x + (*Near[i]).x;
int yTemp = pointTemp.y + (*Near[i]).y;
//进入点判断该店是否超过边界
if (xTemp < gameMap->Get_Row() && yTemp < gameMap->Get_Col() && xTemp > 0 && yTemp> 0 )
{
if (0 == gameMap->Get_GameMap()[pointTemp.x + (*Near[i]).x][pointTemp.y + (*Near[i]).y]
||