您的位置 首页 传感器

栈的妙用-完成迷宫问题

堆栈是计算机程序中非常重要的一部分,主要用来参数的调用,局部变量的存储等,在C语言中的函数调用过程中通过不同函数的堆栈空间可以非常

仓库是计算机程序中十分重要的一部分,首要用来参数的调用,局部变量的存储等,在C语言中的函数调用进程中经过不同函数的仓库空间能够十分便利的找到传递进来的参数以及退出时应该回来的地址。详细的参看“函数调用剖析 ”,这篇文章中经过实例剖析评论了函数调用进程中仓库的改变进程。

实质上栈的运用并不是只能在函数调用中,栈作为一种数据结构,天然有其特别的含义,栈的最大特色是”先入后出,后入先出”,这个特色能够用来结局许多的问题。C语言中的函数调用算是其间的最首要的用法之一,也就不再剖析和评论。相同递归,嵌套调用等都归于函数调用的子类也不再描绘。在其他方面经典的运用是处理迷宫问题,不同进制数值之间的转化,长字符串的分化以及算术表达式的求值等。下面我首要选用栈完结经典的迷宫问题。
迷宫问题
迷宫问题是经典的一类问题,怎么从给出的进口找到对应的出口,完结的办法和马踏棋盘问题类似也是经过找到周围8个方向坐标的联系,然后根据深度优先查找办法和必定的条件找到下一步对应的出路。因为迷宫问题需求存储详细的完结路劲,这与前面的问题存在必定的不同。选用栈能够很好的处理这个问题,其间栈结构用来存储详细的坐标和方向。这样根据栈就能确保今后每一次都能快速的找到出路。
完结的根本过程如下:
1、为了防止边界检测问题,在迷宫的外围增加一层围墙,比方本来的迷宫为m*n,则增加围墙今后的矩阵为(m+2)*(n+2)。其间为1表明不能走通,0时表明能够走通。这样maze[1][1]表明迷宫的进口,而maze[m][n]表明迷宫的出口。
2、创立一个仓库空间,能够选用静态数组的办法,但因为不能精确的估量数组空间巨细,能够选用动态创立的办法。并将进口坐标值压入到栈中。界说一个与迷宫巨细相同的矩阵mark,用来计算当时坐标是否现已抵达过,当没有抵达坐标(i,j)时,则有mark[i][j] = 0,假如之前抵达过,则有mark[i][j] = 1.这样首要是为了防止构成内部死循环,一起阐明此路不能走通。
3、检测栈空间是否为空,假如为空则中止,假如不为空,则弹出栈顶的元素.
4、选用循环的办法,根据元素的方向确认下一个坐标,详细的确认办法根据之前的移动联系找到,判别该方位是否为0(maze[nextrow][nextcol] == 0)以及之前是否抵达该方位(mark[nextrow][nextcol] == 1)。假如满意条件,则将mark[nextrow][newcol]设置为1,并将当时方位以及详细的方向值压入栈中,将当时坐标设置为之前确认的下一个坐标,设置方向为0。然后从头进行过程4。假如8个方向悉数不能找到适宜的下一个坐标,阐明此路走不通。从头进行过程3,探究新的路劲。探究成功的条件是(nextrow == EXIT_ROW&&nextcol == EXIT_COL)。

根本的完结流程图如下所示:

代码完结如下:

/*maze_problem.h*/
#ifndef MAZE_PROBLEM_H_H_
#define MAZE_PROBLEM_H_H_

typedef struct
{
int vert;
int horiz;
}offsets;

typedef struct {
int row;
int col;
int dir;
}element;

typedef struct {
int row;
int col;
}coordinate;
#endif

/*maze_problem.c*/
#include “maze_problem.h”

#include
#include

offsets move[8];

/*the stack save the path, and used */
element * stack;
int top = -1;

void initial_move(void)
{
/*horiz means cols*/
move[0].horiz = 0;
/*vert means rows*/
move[0].vert = -1;

move[1].horiz = 1;
move[1].vert = -1;

move[2].horiz = 1;
move[2].vert = 0;

move[3].horiz = 1;
move[3].vert = 1;

move[4].horiz = 0;
move[4].vert = 1;

move[5].horiz = -1;
move[5].vert = 1;

move[6].horiz = -1;
move[6].vert = 0;

move[7].horiz = -1;
move[7].vert = -1;
}
#define MAZE_ROWS 12
#define MAZE_COLS 15

#define NEW_MAZE_ROWS (MAZE_ROWS + 2)
#define NEW_MAZE_COLS (MAZE_COLS + 2)
#define EXIT_COL 15
#define EXIT_ROW 12

int maze[NEW_MAZE_ROWS][NEW_MAZE_COLS]
= {
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,
1,1,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1,
1,0,1,1,0,0,0,0,1,1,1,1,0,0,1,1,1,
1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,0,1,
1,1,1,0,1,0,0,1,0,1,1,1,1,1,1,1,1,
1,0,0,1,1,0,1,1,1,0,1,0,0,1,0,1,1,
1,0,0,1,1,0,1,1,1,0,1,0,0,1,0,1,1,
1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,
1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,
1,1,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,
1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1,
1,0,1,0,0,1,1,1,1,1,0,1,1,1,1,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
};

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/317758.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部