迷宫问题的总体思路是,从迷宫的入口出发,沿着某一个方向向前试探,若能够行得通,则继续往前走,否则原来返回,再换另一个方向继续试探,直到所有可能的通路都被试探过,为了保证在任何一个位置都能够原来返回,需要设置一个堆栈结构来保存从入口到当前位置的路径。
“Maze.h”
<span style="font-size:18px;"><strong>#pragma once
#include <iostream>
using namespace std;
#include <stack>
#include<assert.h>
void InitMaze(int* maze,size_t n)
{
assert(maze);
FILE* fout = fopen("MazeMap.txt","r");
for (int i = 0;i < n;i++)
{
for (int j = 0;j < n;)
{
char c = fgetc(fout);
if (c == '0' || c == '1')
{
maze[i * n + j] = c - '0';
j++;
}
}
}
fclose(fout);
}
void PrintMaze(int* maze,size_t n)
{
assert(maze);
for (int i = 0; i < n;i++)
{
for (int j = 0;j < n;j++)
{
cout<<maze[i * n +j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
struct Pos
{
int _row;//行
int _col;//列
};
bool CheckIsAccess(int* maze,size_t n,Pos entry)//数组边界条件的检查 是否允许探测
{
if (entry._row >= 0 && entry._col >= 0
&& entry._row < n && entry._col < n
&& maze[entry._row * n + entry._col] == 0)
{
return true;
}
else
{
return false;
}
}
bool GetMazePath(int* maze,size_t n,Pos entry,stack<Pos>& path)//探测
{
assert(maze);
path.push(entry);
maze[entry._row * n + entry._col] = 2;
while (!path.empty())
{
Pos cur = path.top();
if (cur._row == n-1 || cur._col == n-1)
{
return true;
}
//上
Pos next = cur;
next._row--;
if (CheckIsAccess(maze,n,next))
{
maze[next._row * n + next._col] = 2;
path.push(next);
continue;
}
//右
next = cur;
next._col++;
if (CheckIsAccess(maze,n,next))
{
maze[next._row * n + next._col] = 2;
path.push(next);
continue;
}
//下
next = cur;
next._row++;
if (CheckIsAccess(maze,n,next))
{
maze[next._row * n + next._col] = 2;
path.push(next);
continue;
}
//左
next = cur;
next._col--;
if (CheckIsAccess(maze,n,next))
{
maze[next._row * n + next._col] = 2;
path.push(next);
continue;
}
path.pop();
}
return false;
}</strong></span>
test.cpp
<span style="font-size:18px;"><strong>#define _CRT_SECURE_NO_WARNINGS 1
#include "maze.h"
void test()
{
int maze[10][10] = {};
InitMaze((int* )maze,10);
PrintMaze((int* )maze,10);
Pos entry = {2,0};//入口给定maze[2][0]
stack<Pos> path;//需要栈的协助
GetMazePath((int* )maze,10,entry,path);
PrintMaze((int* )maze,10);
}
int main()
{
test();
system("pause");
return 0;
}</strong></span>