我们知道栈的特点是:后进先出(First In Last Out);也就是说只能在栈的尾部进
行压栈和出栈,而且出栈的时候只能从最后一个数据开始。
所以我们利用栈这个特点,来实现这个迷宫。在这之中我们要采用“回溯”的方法去处理当遇到路径不通的情况。
原理:每找到一个通路,就将这个数据压栈,这样当前位置的上一个位置就位于栈的顶部,假如当前位置的上下左右都找不到通路的时候,就开始回溯,也就是开始从来的路往回走,而之前走过的路都存在栈里面,所以只需要一个一个的Pop就能依次往回退,每退一次,就寻找上下左右有没有通路,如果找到通路就继续往下走,并压栈,直到走出整个迷宫。
#define _CRT_SECURE_NO_WARNINGS 1
#include"MazeMap.h"
#include<stdio.h>
void test()
{
int a[N][N];
GetMaze((int*)a, N);
stack<pos> paths;
pos entry = { 2, 0 };
cout << searchpath((int*)a, 10, entry, paths)<<endl;
display((int*)a, N);
}
int main()
{
test();
system("pause");
return 0;
}
#pragma once
#include<stack>
#include<assert.h>
#define N 10
#include<iostream>
using namespace std;
struct pos
{
int _row;
int _col;
};
void GetMaze(int* a, int n)
{
assert(a);
FILE* fout = fopen("C:\\maze.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') //只读有效的字符,遇空格不转换
{
a[i * n + j] = ch - '0';
j++;
}
else
{
continue;
}
}
}
fclose(fout);
}
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[next._row*n + next._col] == 0)
{
return true;
}
else
{
return false;
}
}
bool searchpath(int* a, int n, pos entry, stack<pos>& paths)
{
assert(a);
paths.push(entry); //将入口地址(坐标)push到栈中
while (!paths.empty()) //如果栈为空,就没找到出口
{
pos cur = paths.top();
a[cur._row*n + cur._col] = 2; //将走过的路径置为2
if (cur._row == n - 1)
{
return true;
}
pos next = cur; //先将cur赋给next 为了下面如果next改变后不满足, next._row--;//上
if (CheckisAccess(a, n, next))
{
cur = next;
paths.push(cur);
continue;
}
next = cur;
next._col++;//右
if (CheckisAccess(a, n, next))
{
cur = next;
paths.push(cur);
continue;
}
next = cur;
next._row++;//下
if (CheckisAccess(a, n, next))
{
cur = next;
paths.push(cur);
continue;
}
next = cur;
next._col--;// 左
if (CheckisAccess(a, n, next))
{
cur = next;
paths.push(cur);
continue;
}
next = cur;
paths.pop(); //如果遇到不通(在此即四个方向都不为0)然后,让栈中保存
} 的坐标pop(即往回倒)重复试探四个方向 直到找到另一
return false; 条可通路径;
}
void display(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;
}
}
至此,一个简单的迷宫就完成了,以上左边的图就是开始的迷宫。右边的图是结果。最终,每次走过的地方都被标志成2.
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。