题目:迷宫-深度策略
一个陷入迷宫的老鼠如何找到出口的问题。老鼠希望系统性地尝试所有的路径之后走出迷宫。如果它到达一个死胡同,将原路返回到上一个位置,尝试新的路径。在每个位置上老鼠可以向八个方向运动,顺序是从正东开始按照顺时针进行。无论离出口多远,它总是按照这样的顺序尝试,当到达一个死胡同之后,老鼠将进行“回溯”。迷宫只有一个入口,一个出口,设计程序要求输出迷宫的一条通路。迷宫用二维存储结构表示,1表示障碍,0表示通路;采用回溯法设计求解通路的算法。要求如下:
1、实现栈的相关操作; 2、利用栈实现回溯算法输出路径;输入格式: 输入包括三部分: 第一个输入是迷宫大小;第二个输入是迷宫的状态;第三个输入是入口和出口位置
输出格式: 反向输出探索的路径,注意包括入口和出口位置。每个位置之间用分号;分隔。
输入样例: 9 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 1 0
0 1 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1
1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 7 7 输出样例: 7 7;6 6;5 7;4 6;4 5;3 4;2
5;2 4;2 3;1 2;1 1;
解题思路:
迷宫问题是数据结构中常见的一种类型,也可以当作是网格类问题的一种,对于这种问题,一般有深度优先DFS和广度优先BFS方法
下面介绍用栈知识实现深度优先DFS的方法,使用栈解决需要用到栈的基本操作:
- 栈的建立,初始化,入栈,出栈,栈的判空等。
- 迷宫的数据结构:用二维数组表示迷宫结构
- 回溯算法:使用栈实现回溯,探索迷宫所有可能的路径,遇到障碍时回溯。
下面给出程序的实现及步骤分析:
- 首先时栈的基本操作的实现
typedef int DataType;
struct Node//栈节点类型定义
{
DataType data;
struct Node* next;
};
typedef struct Node* PNode;
typedef struct Node* top, * LinkStack;
//空栈创建
LinkStack SetNullStack_Link()
{
LinkStack top = (LinkStack)malloc(sizeof(struct Node));
if (top != NULL)
top->next = NULL;
else
printf("Alloc failure");
return top;
}
//栈判空
int IsNullStack_link(LinkStack top)
{
if (top->next == NULL)
return 1;
else
return 0;
}
//进栈函数
void Push_link(LinkStack top, DataType x)
{
PNode p;
p = (PNode)malloc(sizeof(struct Node));
if (p == NULL)
printf("Alloc failure");
else
{
p->data = x;
p->next = top->next;
top->next = p;
}
}
//出栈函数
void Pop_link(LinkStack top)
{
PNode p;
p = (PNode)malloc(sizeof(struct Node));
if (IsNullStack_link(top))
printf</

最低0.47元/天 解锁文章

1522

被折叠的 条评论
为什么被折叠?



