问题描述
给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口。如下图所示:
该图是一个矩形区域,有一个入口和出口。迷宫内部包含不能穿越的墙壁或者障碍物。这些障碍物沿着行和列放置,与迷宫的边界平行。迷宫的入口在左上角,出口在右下角。
问题分析
-
首先要有一张迷宫地图,地图由两部分组成:
(1)一是迷宫中各处的位置坐标,
(2)二是迷宫各位置处的状态信息,即该处是墙还是路
所以,该迷宫地图可由一个二维数组来表示。数组的横纵坐标表示迷宫各处的位置坐标,数组元素表示各位置处的状态信息。
2.在这里,假定:
(1)迷宫地图是m*n的,即二维数组是m行n列的。
(2)在迷宫中用1表示墙,用0表示路。当然,为了便于标识,我们后面还会用其他数字代表更多含义。
因此,迷宫的地图一个刻画如下:
现在我们要找一条从入口到出口的路径。路径是一个由位置组成的序列,每一个位置都没有障碍,并且除入口外,路径上的每一个位置都是前一个位置在东西南北方向上相邻的一个位置。
不过,考虑到边界问题不太好处理。我们做这样的工作,在地图外围加一层围墙,给它全部填上1。这样,在处理各个坐标时,都没有差别了。这样一来便大大简化了我们的工作。
下面我们要编写程序求解这个问题。
程序设计
这次还是采用一个简单的模块化来设计这个程序。那么主要有下面几个模块:
- 显示欢迎信息
- 初始化工作
- 生成地图
- 找路
- 打印地图和路径
下面我们分别完成这些功能。
显示欢迎信息
这个模块就很简单了,输出一些信息提醒使用者就行,主要是为了增加程序的友好性而设置的。大家根据自己的需要自行发挥。例如我的就很随便了:
1void welcome()
2{
3 cout << "welcome to RAT IN MAZE" << endl;
4 system("pause");
5 system("cls");
6}
初始化工作
这个主要是设置一些全局变量的取值和完成内存的分配,地图的存储还是从堆上分配内存比较好。因为一般来说,考虑到地图可能会很大,这样需要的存储空间就很多了。在这里一并把相关的全局变量给讲解了吧。
1typedef struct
2{
3 int row;
4 int col;
5}POSITION;
6
7
8const POSITION maze_size = { 20 , 60 };
9
10int ** const maze = new int*[maze_size.row + 2];
11
12stack<POSITION> path;