一、实验目的
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表示墙
² 如果能走通,则输出路径和路径的长度;若不能走通,则输出提示不能走通
² 带有路径的迷宫布局
思路:
定义一个二位数组,保存这些迷宫的节点,并且规定等于1的数组表示为墙,等于0的数组表示为通道,为了不让探索路线的时候,走出所定义的迷宫区域,我们建立一堵墙将除了出口为0外,别的都为1,即为墙。
迷宫建立好了,怎么探索路线呢?首先,每个节点都有8个方向可以探索,每个节点都有八个方向,