数据结构实验-迷宫问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
迷宫问题
一、实验目的
掌握采用深度优先策略求解迷宫问题
二、实验内容
本实验解决陷入迷宫的老鼠如何找到出口的问题,老鼠希望尝试所有的路径之后走出迷宫,如果它到达一个死胡同,将原路返回到上一个位置,尝试新的路径。在每个位置上老鼠可以向8个方向运动,即东、南、西、北、东南、东北、西南、西北。无论离出口多远,它总是按照这样的顺序尝试,当到达一个死胡同之后,老鼠将进行“回溯”,迷宫只有一个入口、一个出口,设计程序输出迷宫的一条通路,实验内容如下:
(1)设计迷宫的存储结构;
(2)采用回溯法设计求解通路的算法,利用栈实现回溯算法。迷宫如下:
Enter-> 0 1 1 1 0 0 0 0 0 0
0 0 0 1 0 0 0 1 0 0
0 1 0 1 1 0 0 1 0 0
0 1 0 0 1 0 1 1 0 0
0 1 0 0 1 0 1 1 0 0
1 1 1 0 1 0 1 0 0 0
0 0 1 0 0 0 1 0 1 1
0 0 1 0 0 0 1 0 1 1
0 1 1 0 1 0 1 0 0 0
0 0 0 0 1 0 1 1 0 0 --> EXIT
下面是可能的路径(注意:从入口到出口可能有多条路径,优先选择的方向不同,路径可能也不一样!)Path: ( maze[0][0], maze[1][0], maze[1][1], maze[1][2], maze[2][2],
maze[3][2], maze[3][3], maze[4][3], maze[5][3], maze[6][3],
maze[6][4], maze[6][5], maze[5][5], maze[4][5], maze[3][5],
maze[2][5], maze[2][6], maze[1][6], maze[0][6], maze[0][7],
maze[0][8], maze[1][8], maze[2][8], maze[3][8], maze[4][8],
maze[5][8], maze[5][7], maze[6][7], maze[7][7], maze[8][7],
maze[8][8], maze[8][9], maze[9][9])
Enter-> X 1 1 1 0 0 X---X---X 0
X---X---X 1 0 0 X 1 X 0
0 1 X 1 1 X---X 1 X 0
0 1 X---X 1 X 1 1 X 0
0 1 0 X 1 X 1 1 X 0
1 1 1 X 1 X 1 X---X 0
0 0 1 X---X---X 1 X 1 1
0 0 1 0 0 0 1 X 1 1
0 1 1 0 1 0 1 X-- X-- X
0 0 0 0 1 0 1 1 0 X --> EXIT
1、提示:
(1)数据结构:
✧用二维数组MAZE[m+2][n+2]表示迷宫的结构,数组中的值为1表示是墙,为0表示可以走通。
(用MAZE[m+2][n+2]而不用MAZE[m][n]的原因在于想表示和编写代码时简单些,而且让迷宫周围都是墙,防止错误的走出去)
✧用二维数组MARK[m+2][n+2]表示迷宫是否被走过,主要是为了回溯时已经证明走不通的路线就
不要再去走了。(用MARK[m+2][n+2]而不用MARK[m][n]的原因在于想表示和编写代码的时简单些)
✧二维数据MOVE[8][2]是为了更方便的移动到下一步,改变坐标。这个二维数组是为了更好的转
换坐标(八个方向,从0到7),而且也能避免重复走路
✧用栈保存走过的路径
(2)输出:
✧迷宫布局,用0表示可以走通的地方,用1表示墙
✧如果能走通,则输出路径和路径的长度;若不能走通,则输出提示不能走通
✧带有路径的迷宫布局
2、非递归算法
Path(MAZE, MARK, m, n, MOVE, STACK)
//A binary matrix MAZE(0:m+1,0:n+1) holds the maze.
//STACK(mn,2) records the path
{
MARK(1,1)=1;
STACK.push((1,1,1));
While not STACK.empty()
{
(i,j,mov) = STACK.top();
STACK.pop();
While mov!=8
{
g=i+MOVE(mov,1);
h=j+MOVE(mov,2);
if g=m and h=n
{
reverseprint STACK;
printi,j;
printm,n;
return;
}
if MAZE(g,h)=0 and MARK(g,h)=0
{
MARK(g,h)=1;
STACK.push((i,j,mov));
i=g;
j=h;
mov=0;
}
elsemov=mov+1;
}
}
print “No path has been found”
}
附录:STL中栈的使用
#pragma warning(disable:4786)
#include
#include
using namespace std ;
typedef stack
int main()
{
STACK_INT stack1;
cout<< "stack1.empty() returned " <<
(stack1.empty()? "true": "false") < cout<< "stack1.push(2)" < stack1.push(2); if (!stack1.empty()) // Function 3 cout<< "stack1.top() returned " << stack1.top() < cout<< "stack1.push(5)" < stack1.push(5); if (!stack1.empty()) // Function 3 cout<< "stack1.top() returned " << stack1.top() < cout<< "stack1.push(11)" < stack1.push(11); if (!stack1.empty()) // Function 3 cout<< "stack1.top() returned " << stack1.top() < // Modify the top item. Set it to 6. if (!stack1.empty()) { // Function 3 cout<< "stack1.top()=6;" <