一、问题描述
以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
二、基本要求
首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向,如:对于下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(3,2,3),(3,1,2),…。
三、求解思路
1、定义迷宫数据结构: 使用一个二维数组来表示迷宫,其中0表示通路,1表示障碍。另外,我们需要追踪迷宫中的访问情况,以及路径上的步骤和方向信息。
2、使用非递归方式搜索路径: 可以使用一个栈来辅助搜索迷宫的路径。
3、输出路径信息: 当找到终点时,栈中保存了从起点到终点的路径信息。我们可以依次从栈中取出路径上的点坐标和方向信息,并输出为三元组的形式(i,j,d),表示每一步的位置和方向。
4、处理无通路情况: 如果栈为空而仍未找到终点,则说明没有从起点到终点的通路。
5、其他辅助函数: 在程序中还需要实现一些辅助函数,比如判断下一个位置是否合法,初始化迷宫,输出迷宫等。这些函数在搜索路径时会被调用。
四、求解代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;//对于操作返回值以及链栈进行宏定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define MAXSIZE 100
#include <stdio.h>
/*----------------------------------*/
/*数据类型的定义*/
typedef int Status;
typedef int Boolean;
typedef struct{
int x,y,dir;
}point; // 点坐标的xy,以及下一步方向dir定义
typedef struct node{
point point;
struct node* next;
}Node; // 对于链栈中节点的定义
typedef Node ElemType;
typedef struct{
Node * top;
Node * bottom;
}Linkstack,*pLinkstack; // 对于链栈整体的定义
int NoSoutionReason = 0; //1 代表起点为障碍,2代表重点为障碍
i