数据结构实验-迷宫问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 STACK_INT;

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;" <

相关文档
最新文档