新建一个.txt文档来存储迷宫,输入n*n的迷宫矩阵并保存起来,如下图
//Stack.h
#pragma once
template <class T>
class stack
{
public:
stack() //构造函数
:_arr(NULL)
, _top(0)
, _capacity(0)
{}
~stack() //析构函数
{
if (_arr)
{
delete[] _arr;
}
}
public:
void Push(const T& x) //插入
{
_CheckCapacity();
_arr[_top++] = x;
}
void Pop() //删除
{
assert(_top > 0);
--_top;
}
size_t Size() //大小
{
return _top;
}
bool Empty() //判断栈是否为空
{
//return _top == 0;
if (_top <= 0)
{
return true;
}
else
return false;
}
T& Top() //获取栈顶元素
{
return _arr[_top - 1];
}
protected:
void _CheckCapacity()
{
if (_arr == NULL)
{
_capacity = 5;
_arr = new T[_capacity];
return;
}
else if (_top == _capacity)
{
_capacity *= 2;
T* tmp = new T[_capacity];
for (size_t i = 0;i < _top;++i)
{
tmp[i] = _arr[i];
}
delete[] _arr;
_arr = tmp;
}
}
protected:
T* _arr;
size_t _top;
size_t _capacity;
};
//Maze.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <assert.h>
#include "Stack.h"
struct Pos
{
int _row;
int _col;
};
//函数声明
void GetMaze(int* a, int n);
bool SearchMazePath(int *a, int n, Pos entrance, stack<Pos>& paths);
bool CheckIsAccess(int* a, int n, const Pos& next);
void GetMaze(int* a, int n) //将迷宫存到一个一维数组a里
{
assert(a);
FILE* fout = fopen("E:\\MazeMap.txt", "r"); //以读的方式读取迷宫矩阵
assert(fout);
for (int i = 0;i < n;++i)
{
for (int j = 0;j < n;)
{
char ch = fgetc(fout);
if (ch == '1' || ch == '0') //矩阵中‘0’为通路
{
a[i*n + j] = ch - '0';
cout << a[i*n + j]<<" ";
++j;
}
}
cout << endl;
}
cout << endl;
}
bool CheckIsAccess(int* a, int n, const Pos& next)
{
int row = next._row;
int col = next._col;
if (row >= 0 && row < n && col >= 0 && col < n && a[row*n + col] == 0)
{
return true;
}
else
{
return false;
}
}
//寻找通路,并用栈来存储
bool SearchMazePath(int *a, int n, Pos entrance, stack<Pos>& paths)
{
assert(a);
paths.Push(entrance);
bool isfirst = true;
while (!paths.Empty())
{
Pos cur = paths.Top();
a[cur._row*n + cur._col] = 7; //将通路标记为7
if (isfirst == false || cur._row == n - 1 || cur._col == n - 1
|| cur._row == 0 || cur._row == 0 ) //如果找到矩阵的四个边就表示找到通路
{
return true;
}
Pos next = cur;
//判断当前元素的上路是否为通路,即是否为‘0’
next._row--;
if (CheckIsAccess(a, n, next))
{
paths.Push(next);
continue;
}
//判断当前元素的下路是否为通路
next = cur;
next._row++;
if (CheckIsAccess(a, n, next))
{
paths.Push(next);
continue;
}
//判断当前元素的左路是否为通路
next = cur;
next._col--;
if (CheckIsAccess(a, n, next))
{
paths.Push(next);
continue;
}
//判断当前元素的右路是否为通路
next = cur;
next._col++;
if (CheckIsAccess(a, n, next))
{
paths.Push(next);
continue;
}
paths.Pop();
isfirst = false;
}
return false;
}
//打印迷宫矩阵
void PrintMaze(int* a, int n)
{
for (int i = 0;i < n;++i)
{
for (int j = 0;j < n;++j)
{
cout << a[i*n + j] << " ";
}
cout << endl;
}
cout << endl;
}
int main()
{
int size = 5;
int mazemap[25] = { 0 };
Pos entrance;
entrance._row = 1;
entrance._col = 0;
stack<Pos> path;
GetMaze(mazemap, size);
if (SearchMazePath(mazemap, size, entrance, path))
{
PrintMaze(mazemap, size);
}
system("pause");
return 0;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。