迷宫问题:
如图所示:从左上角出发,然后从下面出来。
利用文件读写的方式,读取迷宫,然后利用栈,进行搜索是否能够找到出口,上下左右四个方向进行判断,如果找不到,就回溯。
#pragma once
#pragma once
#include<assert.h>
#include<stack>
#define N 10
struct Position
{
int _row; //行
int _col; //列
Position(int row, int col)
:_row(row)
, _col(col)
{}
};
template<class T>
bool SearchMazePath(int* a, int n, Position entry, stack<T>& paths)
{
assert(a);
paths.push(entry);//
while (!paths.empty())
{
Position cur = paths.top();
a[cur._row*n + cur._col] = 2;//将数字变为2,记为通路
if (cur._row == n - 1)
{
return true;//终止位置为迷宫下方任何一点,只要走到下方,就算为赢
}
//上
Position tmp = cur;//将cur这个点临时记为tmp,用来做上下左右四个方向的测试
--tmp._row;//--row变为上一行
if (a[tmp._row*n + tmp._col] == 0)//如果为0,就说明是对的路径
{
paths.push(tmp);//将这个点压入栈
continue;
}
//下
tmp = cur;
++tmp._row;//++row,变为下一行
if (a[tmp._row*n + tmp._col] == 0)
{
paths.push(tmp);
continue;
}
//左
tmp = cur;
--tmp._col;
if (a[tmp._row*n + tmp._col] == 0)
{
paths.push(tmp);
continue;
}
//右
tmp = cur;
++tmp._col;
if (a[tmp._row*n + tmp._col] == 0)
{
paths.push(tmp);
continue;//停止以下操作,直接进入下一次循环
}
paths.pop();//如果四个方向都没有符合的,就说明这条路不对,则应该pop这个点
//因为原来的点已经被改为数字2了,在没有数字0,就应该pop
}
return false;
}
//读取迷宫
void GetMaze(int* a, int n)
{
assert(a);//断言
//以读的方式打开绝对路径的MazeMp.txt
FILE* fout = fopen("C:\\Users\\apple\\Desktop\\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')//地图中如果是1或0
{
a[i*n + j] = ch - '0'; //字符型变成整形
++j;//只有在是有效字符的情况下j才++,不然放在外面会出现问题
}
else
{
continue;
}
}
}
}
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;
}
void Test()
{
int array[N][N] = { 0 };
Position ps(2, 0);//posotiom是一个结构体,行和列会记录位置,代表入口位置
GetMaze((int*)array, N);//读取迷宫
PrintMaze((int*)array, N);//打印迷宫
stack<Position> paths; //用栈创建一个paths,用来寻找路径
SearchMazePath((int*)array, N, ps, paths);
PrintMaze((int*)array, N);
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include"Maze.h"
int main()
{
Test();
system("pause");
return 0;
}
如有不正确的地方,希望能够指出,一起学习进步,谢谢了。