迷宫与栈问题

迷宫与栈问题
迷宫与栈问题

利用栈实现迷宫的求解 一、要解决的问题: 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 二:算法基本思想描述: 用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的边界;第1行第1列元素和第m行第n列元素置成“0”,表示迷宫的入口和出口走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、南、西、北4个方向顺序试探下一个位置; 用二维数组move记录4个方向上行下标增量和列下标增量,则沿第i个方向前进一步,可能到达的新位置坐标可利用move数组确定: Px=x+move[i][0] Py=y+move[i][1] 如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索; 如果4个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。 三:设计: 1:数据结构的设计: (1)定义三元数组元素的结构 typedef struct MazeDirect { int Dx; //行标 int Dy; //列标 int direct; //走到下一个坐标点的方向 }MazeDirect; (2)定义链表节点的结构组成 typedef struct LinkNode { elemtype data; //数据域 struct LinkNode *next; //指针域 }LinkNode; (3)定义链栈的头指针 typedef struct {

利用栈实现迷宫的求解 一、要解决的四个问题: 1、表示迷宫的数据结构: 设迷宫为m行n列,利用maze[m][n]来表示一个迷宫,maze[i][j]=0或1; 其中:0表示通路,1表示不通,当从某点向下试探时,中间点有4个方向可以试探,(见图)而四个角点有2个方向,其它边缘点有3个方向,为使问题简单化我们用maze[m+2][n+2]来表示迷宫,而迷宫的四周的值全部为1。这样做使问题简单了,每个点的试探方向全部为4,不用再判断当前点的试探方向有几个,同时与迷宫周围是墙壁这一实际问题相一致。 如图3.4表示的迷宫是一个6×8的迷宫。入口坐标为(1,1),出口坐标为(m,n)。 入口(1,1) 图 1 用maze[m+2][n+2]表示的迷 宫 迷宫的定义如下: #define m 6 /* 迷宫的实际行 */ #define n 8 /* 迷宫的实际列 */ int maze [m+2][n+2] 2 、试探方向: 在上述表示迷宫的情况下,每个点有4个方向去试探,如当前点的坐标(x , y),与其相邻的4个点的坐标都可根据与该点的相邻方位而得到,如图2所示。因为出口在(m,n),因此试探顺序规定为:从当前位置向前试探的方向为从正东沿顺时针方向进行。为了简化问题,方便的求出新点的坐标,将从正东开始沿顺时针进行的这4个方向(用0,1,2,3表示东、南、西、北)的坐标增量放在一个结构数组move [ 4 ]中,在move 数组中,每个元 m n 素有两个域组成,x:横坐标增量,y:纵坐标增量。Move数组如图3所示。 move数组定义如下: typedef struct { int x //行 int y //列 } item item move[4] 这样对move的设计会很方便地求出从某点 (x,y) 按某一方向 v (0≤v≤3) 到达的新点(i,j)的坐标:i =x + move[v].x ,j = y + move[v].y 。 3.栈的设计: 当到达了某点而无路可走时需返回前一点,再从前一点开始向下一个方向继续试探。因此,压入栈中的不仅是顺序到达的各点的坐标,而且还要有从前一点到达本点的方向,即每走一步栈中记下的内容为(行,列,来的方向)。对于图1所示迷宫,依次入栈为: 栈中每一组数据是所到达的每点的坐标及从该点沿哪个方向向下走的,对于图3迷宫,走

实验报告 【实验名称】项目一迷宫问题的求解 【实验目的】 1.了解栈的基本操作以及充分理解栈的特点。熟悉掌握栈的基本操作和结构体 的运用。 2.学会用栈或者递归方法解决迷宫问题。 【实验原理】 1.本次实验中,以二维数组maze[row][col]表示迷宫,0表示通路,1表示墙,在构建迷宫时,为了清晰显示,在最外层添加一圈墙。 2.算法的核心思想是利用栈后进先出的特点,对迷宫进行探索,如果此路可行,则将此坐标的信息入栈,如果此路不通,则将此坐标的信息出栈。 3.输入形式:根据控制台的提示,依次输入迷宫的行数、列数,然后输入迷宫,再输入入口和出口坐标。 4.输出形式:由用户选择,由递归、非递归两种求解方式输出一条迷宫通路。以非递归方式会显示一种求解方案,并给出相应的三元组序列和迷宫方阵;以递归方式则会显示出所有的路线。 【实验内容】 1.需求分析 (1)问题描述 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 要求以递归和非递归两种方式分别输出一条迷宫的通路,以带方向坐标和迷宫图像表示。

(2)基本要求 (1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。 (2)编写递归形式的算法,求得迷宫中所有可能的通路。 (3)以方阵形式输出迷宫及其通路。 2.概要设计 (1)栈的抽象数据类型 ADT Stack{ 数据对象:D={ai|ai∈ElemSet, i=1,2, …,n, n≥0} 数据关系:R1={|ai-1,ai∈D, i=1,2, …,n } 约定an端为栈顶,a1端为栈底。 基本操作: InitStack( &S ) 操作结果:构造一个空栈S。 DestroyStack ( &S ) 初始条件:栈S已存在。 操作结果:销毁栈S。 ClearStack( &S ) 初始条件:栈S已存在。 操作结果:将S清为空栈。 StackEmpty( S ) 初始条件:栈S已存在。 操作结果:若S为空栈,则返回TRUE,否则返回FALSE。 StackLength( S ) 初始条件:栈S已存在。 操作结果:返回S的数据元素个数,即栈的长度。 GetTop( S, &e ) 初始条件:栈S已存在且非空。 操作结果:用e返回S的栈顶元素。 Push( &S, e ) 初始条件:栈S已存在。 操作结果:插入元素e为新的栈顶元素。 Pop( &S, &e ) 初始条件:栈S已存在且非空。 操作结果:删除S的栈顶元素,并用e返回其值。 }ADT Stack (2)程序模块

#include #include #include #define STACK_INIT_SIZE 100 #define INCREMENT 10 typedef struct { int r; int c; }zuobiao; typedef struct { int ord; //在当前坐标上的“标号” zuobiao seat; //坐标 int di; //走向下一通道的方向 }lujing; typedef struct { int sz[10][10]; }Maze; typedef struct SqStack { lujing *base; lujing *top; int size; }SqStack; int initStack(SqStack *s) { s->base = (lujing *)malloc(STACK_INIT_SIZE*sizeof(lujing) ); if(!s->base) return -1; s->top = s->base; s->size = STACK_INIT_SIZE; return 0; } int push(SqStack *s, lujing e) {

if(s->top - s->base >= s->size) { s->base = (lujing *)realloc(s->base, (s->size+INCREMENT)*sizeof(lujing)); if(!s->base) return -1; s->top = s->base+s->size; s->size += INCREMENT; } *s->top++ = e; return 0; } int pop(SqStack *s,lujing *e) { if(s->top == s->base) return -1; *e = *(--s->top); return 0; } int isEmpty(SqStack *s) { if(s->base == s->top) return 1; else return 0; } int pass( Maze maze,zuobiao dqzb) { if (maze.sz[dqzb.r][dqzb.c]==1) return 1; // 如果当前位置是可以通过,返回1 else return 0; // 否则返回0 } void footPrint(Maze &maze,zuobiao dqzb) { maze.sz[dqzb.r][dqzb.c]=9; } void markPrint(Maze &maze,zuobiao dqzb) { maze.sz[dqzb.r][dqzb.c]=4; } zuobiao nextPos(zuobiao dqzb, int Dir) {

数据结构实验报告 题目:用栈解决迷宫问题 .需求分析 1.以结构体 Maze 表示迷宫,其中 pos 表示该位置是否有障碍; freq 记录该位置被经过的次数;数组 move 表示下一步的方向。 2. 本程序自动随机生成一个12 × 12大小的迷宫,字符“ H”表示有障碍,空符表示通 路。 3. 迷宫的入口为左上角,出口为右下角。 4. 本程序只求出一条成功的通路。 .概要设计 为了实现上述操作,以栈为存储结构。 本程序包含三个模块: 1)主程序模块 :实现人机交互。 2)迷宫生产模块:随机产生一个12× 12的迷 宫。 3)路径查找模块:实现通路的查找。 4)求解迷宫中一条通路的伪代码: do{ 若当前位置可同,则{ 将当前位置插入栈顶;若该位置是出口位置,则结束;否则切换当前位置的东临方块为新的当前位置;} 否则 { 若栈不空且栈顶位置尚有其他方向未被探索,则设定新的的当前位置为沿顺时针 方向旋转找到的栈顶位置的下一相邻块若栈不空但栈顶位置的四周均不可通, 则{ 删去栈顶位置; 若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈 至栈空。 } } } while( 栈不空 ) 三. 详细设计栈的设计: typedef struct { Node *base,*top; int length; }Stack; Stack *initstack(); // 初始化栈 void printstack(Stack *s); // 打印栈 Status destroy(Stack *); // 销毁整个栈 Status deltop(Stack *s); // 出栈 Status pushelem(Stack *,ElemType ,ElemType); // 进栈 1. 主程序模块: int main() { printf(" 随机产生一个12× 12 的迷宫, X 字符表示障碍,空符表示通路: \n"); Maze a[N][N]; makemaze(a); printf(" 输入回车键显示路径 ,* 字符表示路径。 \n"); getchar(); findpath(a); while(1); return 0;

求迷宫问题就是求出从入口到出口的路径。在求解时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前试探,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续试探,直至所有可能的通路都试探完为止。为了保证在任何位置上都能沿原路退回(称为回溯),需要用一个后进先出的栈来保存从入口到当前位置的路径。 首先用如图所示的方块图表示迷宫。对于图中的每个方块,用空白表示通道,用阴影表示墙。所求路径必须是简单路径,即在求得的路径上不能重复出现同一通道块。 为了表示迷宫,设置一个数组mg,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块为墙,如图所示的迷宫,对应的迷宫数组mg如下: int mg[M+1][N+1]={ /*M=10,N=10*/ {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1},

{1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} }; 伪代码: c语言描述如下:

void mgpath() /*路径为:(1,1)->(M-2,N-2)*/ { int i,j,di,find,k; top++; /*初始方块进栈*/ Stack[top].i=1; Stack[top].j=1; Stack[top].di=-1; mg[1][1]=-1; while (top>-1) /*栈不空时循环*/ { i=Stack[top].i; j=Stack[top].j; di=Stack[top].di; if (i==M-2 && j==N-2) /*找到了出口,输出路径*/ { printf("迷宫路径如下:\n"); for (k=0;k<=top;k++) { printf("\t(%d,%d)",Stack[k].i,Stack[k] .j); if ((k+1)%5==0) printf("\n"); }

数组栈解决迷宫问题 /*[迷宫问题]分析: 1.建立一个路径栈path_stack,其中栈内有x,y用来记录坐标 东南西北4个方向,分用用east,south,west,north表示 初始位置x,y入栈 { 如果坐标[x][y+1]东探测为0时,入栈并标记当前坐标为2表示已行走过 否则坐标[x+1][y]南探测为0时,入栈............................. 否则坐标[x][y-1]西探测为0时,入栈.............................. 否则坐标[x-1][y]北探测为0时,入栈.............................. 否则坐标都不为0,此时探测到死角,这时就须要返回走 即出栈返回x,y新坐标 ......继续探测为0的出口 每执行一次判断终点坐 } !!!严重注意:本程序在Turboc C++中运行时没有异常,在Visual C++ 6.0中编译也成功,运行时全部正常,但是得不到正确答案,原因是Visual C++ 6.0 结构体类型返回有误,该变量虽返回,但值没有返回,所以 只须按结构体指针类型返因即可,TMD从凌晨1点卡到凌晨2点半 *///程序编写: #include #define MAX 100 struct node //栈的内容

{ int x; int y; }path_stack[MAX]; int path_top=-1; int path_isEmpty() //栈的方法函数{ if (path_top==-1) return 1; else return 0; } int path_push(int x,int y) { if (path_top>=MAX) { printf("Stack go beyond!\n"); return 0; } else { path_top++; path_stack[path_top].x=x; path_stack[path_top].y=y; return 1; }

目录 一、系统开发的背景............................................................ 1 . 二、系统分析与设计............................................................ 1 .(一)系统的分析.............................................................. 1 . (二)系统的具体分析设计............................................................................... 2.. . 三、系统的功能要求 (2) (一)系统模块结构设计........................................................ 3 . 四、系统的设计与实现 (4) (一)在栈中实现迷宫的具体操作 4... (二)栈的生成................................................................ 6 .(三)整个系统的生成流程图 .................................................. .8五、系统测试.................................................................. 9 . (一) .................................... 测试迷宫与栈问题可通的程序设计.. (9) (二) ............................................................... 测试迷宫与栈问题不可通的程序设计 (10)

数据结构与算法实验报告

基于栈的C语言迷宫问题与实现 一.问题描述 多年以来,迷宫问题一直是令人感兴趣的题目。实验心理学家训练老鼠在迷宫中寻找食物。许多神秘主义小说家也曾经把英国乡村花园迷宫作为谋杀现场。于是,老鼠过迷宫问题就此产生,这是一个很有趣的计算机问题,主要利用“栈”是老鼠通过尝试的办法从入口穿过迷宫走到出口。 迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。求解迷宫问题,即找出从入口到出口的路径。 一个迷宫可用上图所示方阵[m,n]表示,0表示能通过,1 表示不能通过。现假设耗子从左上角[1,1]进入迷宫,编写算法,寻求一条从右下角[m,n] 出去的路径。下图是一个迷宫的示意图: 入口 出口

迷宫示意图 二.算法基本思想 迷宫求解问题是栈的一个典型应用。基本算法思想是:在某个点上,按照一定的顺序(在本程序中顺序为上、右、下、左)对周围的墙、路进行判断(在本程序中分别用1、0)代替,若周围某个位置为0,则移动到该点上,再进行下一次判断;若周围的位置都为1(即没有通路),则一步步原路返回并判断有无其他通路,然后再次进行相同的判断,直到走到终点为止,或者确认没有任何通路后终止程序。 要实现上述算法,需要用到栈的思想。栈里面压的是走过的路径,若遇到死路,则将该位置(在栈的顶层)弹出,再进行下一次判断;若遇到通路,则将该位置压栈并进行下一次判断。如此反复循环,直到程序结束。此时,若迷宫有通路,则栈中存储的是迷宫通路坐标的倒序排列,再把所有坐标顺序打印后,即可得到正确的迷宫通路。 三.程序具体部分的说明 1.迷宫的生成 根据题目的要求,迷宫的大小是自定义输入的。所以在程序中用malloc申请动态二维数组。数组中的元素为随机生成的0、1。数组周围一圈的元素全部定义为1,以表示边界。 2.栈的C语言实现 为了实现栈的功能,即清空、压栈、弹出、返回栈顶元素,在程序中编写了相应的函数。 MakeNULL 清空栈 Push 将横、纵坐标压栈 Topx 返回栈顶存储的横坐标 Topy 返回栈顶存储的纵坐标 Pop 弹出栈顶元素 3.具体的判断算法

数据结构栈求解迷宫问题(C语言版) /* 数据结构C语言版栈求解迷宫问题 P50-52 利用栈求解迷宫问题 编译环境:Dev-C++ 4.9.9.2 日期:2011年2月12日 */ /***************头文件**********************/ // 迷宫坐标位置类型 typedef struct { int x; // 行值 int y; // 列值 }PosType; #define MAXLENGTH 25 // 设迷宫的最大行列为25 typedef int MazeType[MAXLENGTH][MAXLENGTH]; // 迷宫数组[行][列] typedef struct // 栈的元素类型 { int ord; // 通道块在路径上的"序号" PosType seat; // 通道块在迷宫中的"坐标位置" int di; // 从此通道块走向下一通道块的"方向"(0~3表示东~北) }SElemType; // 全局变量 MazeType m; // 迷宫数组 int curstep=1; // 当前足迹,初值为1 #define STACK_INIT_SIZE 10 // 存储空间初始分配量 #define STACKINCREMENT 2 // 存储空间分配增量 // 栈的顺序存储表示P46

typedef struct SqStack { SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 }SqStack; // 顺序栈 /****************实现************************/ // 构造一个空栈S int InitStack(SqStack *S) { // 为栈底分配一个指定大小的存储空间 (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if( !(*S).base ) exit(0); (*S).top = (*S).base; // 栈底与栈顶相同表示一个空栈 (*S).stacksize = STACK_INIT_SIZE; return 1; } // 若栈S为空栈(栈顶与栈底相同的),则返回1,否则返回0。int StackEmpty(SqStack S) { if(S.top == S.base) return 1; else return 0; } // 插入元素e为新的栈顶元素。 int Push(SqStack *S, SElemType e) { if((*S).top - (*S).base >= (*S).stacksize) // 栈满,追加存储空间{ (*S).base = (SElemType *)realloc((*S).base , ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); if( !(*S).base ) exit(0);

/* 顺序栈表示:类型和界面函数声明*/ enum { MAXNUM = 20 /* 栈中最大元素个数,应根据需要定义*/ }; typedef int DataType; /* 栈中元素类型,应根据需要定义*/ struct SeqStack { /* 顺序栈类型定义*/ int t; /* 栈顶位置指示*/ DataType s[MAXNUM]; }; typedef struct SeqStack SeqSack, *PSeqStack; /* 顺序栈类型和指针类型*/ /*创建一个空栈;为栈结构申请空间,并将栈顶变量赋值为-1*/ PSeqStack createEmptyStack_seq( void ); /*判断pastack所指的栈是否为空栈,当pastack所指的栈为空栈时,则返回1,否则返回0*/ int isEmptyStack_seq( PSeqStack pastack ); /* 在栈中压入一元素x */ void push_seq( PSeqStack pastack, DataType x ); /* 删除栈顶元素*/ void pop_seq( PSeqStack pastack ); /* 当pastack所指的栈不为空栈时,求栈顶元素的值*/ DataType top_seq( PSeqStack pastack ); /* 顺序栈表示:函数定义*/ #include #include #include "sstack.h" /*创建一个空栈;为栈结构申请空间,并将栈顶变量赋值为-1*/ PSeqStack createEmptyStack_seq( void ) { PSeqStack pastack = (PSeqStack)malloc(sizeof(struct SeqStack)); if (pastack==NULL)

基于栈实现的迷宫问题 1、问题描述: 在一个二维阵列构成的迷宫里, 数组元素仅有0和1构成,其中0表示可通行的路径, 1代表障碍。另外,定义左上角是迷宫的入口, 右下角是迷宫的出口, 在迷宫里面只允许上下左右四个方向行走, 2、算法基本思想: 由于计算机解迷宫时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,在求迷宫通路的算法中采用“栈”进行求解。 2.1、迷宫构建: 为了避免每走一步便需判断是否走出迷宫的麻烦,将所创建的迷宫用1包围起来。 2.2、位置搜索: 每到一处,总让它按上、下、左、右4个方向试探下一个位置;如果某方向可以通过,即该方向上的元素为0,则前进一步,并在新位置上继续进行搜索;如果4个方向都走不通或曾经走过,则后退一步,在原来的位置上继续试探下一位置。 每前进一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。 3、算法运行环境: VC++6.0 4、主要函数: Mazepath函数: 求解迷宫maze中,从入口start到出口end的一条路径 若存在,返回TRUE,否则返回FALSE InitMaze函数: 创建初始矩阵 按照用户输入的数据构建0/1矩阵,并在矩阵四周添加一圈1作为围墙。 Pass函数: 判断当前节点能否通过。 FootPrint函数: 对于走过的节点用'*' 进行标记。 MarkPrint函数: 对于不能通过的节点用'#' 进行标记。 Nextpos函数; 返回当前节点的下一结点,对应东、西、南、北四个方向。

合肥学院 计算机科学与技术系 课程设计报告 2012 ~2013 学年第二学期 课程数据结构与算法 课程设计名称迷宫问题(栈) 学生姓名陈强 学号1104014026 指导教师李红 专业班级计算机科学与技术11级 2013年3 月

题目:迷宫问题(栈):以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。要求:首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。 一、问题分析和任务定义 此程序可以用二维数组存储迷宫数据,设定入口点的下标为(1,1),出口点的下标为(m,n)。为处理方便起见,在迷宫的四周加一圈障碍。对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通,并默认以东、南、西、北的顺序进行搜索路线。将走过的路线放入链栈中,当走出迷宫时,栈中及走出迷宫的路线;当走不出时,栈为空。 实现本程序需要解决以下几个问题: 1.如何通过二维数组建立并存储迷宫。 2.如何进行路径搜索。 3.按一个方向搜索不到出路时怎么办? 4.将符合条件的路线存储。 5.搜索到出路时按顺序输出路线。 首先,可以用二维数组存储迷宫,0和1分别表示迷宫中的通路和障碍,为处理方便起见,建立迷宫时在迷宫四周加一圈障碍。例如一个5*5的迷宫用二维数组可表示为:int maze[7][7]= {1,1,1,1,1,1,1, 1,0,0,0,0,0,1, 1,1,1,1,1,0,1, 1,0,0,0,0,0,1, 1,0,1,1,1,1,1, 1,0,0,0,0,0,1, 1,1,1,1,1,1,1}; 路径搜索时,需要知道出口和入口的坐标,本程序默认为(1,1)、(m,n)。定义一个移动坐标(xc,yc),用以记录搜索路线时当前位置的坐标。搜索时默认按照东、南、西、北的优先顺序进行查找,其中,向东搜索用“1”表示,向南、向西、向北分别用“2”、“3”、“4”表示,“0”表示方向未知。当向东无路时,再向西查找……当某位置为通路时(maze[i][j]==0),则将这一步的信息放入栈中。同时,将此步设置为障碍,防止下一步搜索时出现“回头”的现象。若为障碍时,此时,将栈中元素出去,即沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。将栈中的元素输出,即寻找到的出迷宫的路线。假如所有可能的通路都探索到而未能到达出口,则所设的迷宫没有通路。如上面的例子中,最后输出的路线为:(1,1,1)、(1,2,1)、(1,3,1)、(1,4,1)、(1,5,2)、(2,5,2)、(3,5,3)、(3,4,3)、(3,3,3)、(3,2,3)、(3,1,2)、(4,1,2)、(5,1,1)、(5,2,1)、(5,3,1)、(5,4,1)、(5,5,0)。 二、数据结构的选择和概要设计 迷宫数据用二维数组int maze[SIZE+2][SIZE+2]来存储即可(迷宫四周加障碍,所以行列数加2),在定义了迷宫的行列数后,利用两个for循环即可用键盘录入迷宫信息,并在迷宫周围加围墙。存储搜索路线按题目要求采用链栈的数据结构,用非递归的方法求解路线。图(1)为程序的流程图。 三、详细设计和编码

程序设计与算法综合训练》设计报告1 学号:E11514064 姓名:汪泓章年级:大一专业:计科 项目名称:迷宫问题的求解完成日期:2016年6月28日 1、需求分析 (1)问题描述:以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 (2)基本要求: 1)首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。 求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d 表示走到下一坐标的方向。如,对于教材第50页图3.4所示的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。 2)编写递归形式的算法,求得迷宫中所有可能的通路。 3)以方阵形式输出迷宫及其通路。 4)按照题意要求独立进行设计,设计结束后按要求写出设计报告。 ①输入输出的要求: ②(i) 求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个 坐标,d表示走到下一个坐标的方向。 (ii)输出迷宫示意图 ③程序所能达到的功能: (i) 实现一个以链表作存储结构的栈类型,以非递归算法求取所有通路和最短路径 (ii)以一个递归算法,对任意输入的迷宫矩阵(1代表不通,0代表通路)求出所有 通路 2、概要设计 i)设计中非递归程序的模块结构图 图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系,虚线方框表示文件的组成

mgpath ():求解迷宫问题,即输出从(1,1)到(M ,N )的全部路径和最短路径(包含最短路径长度)。当找到一条路径时,不使用return 语句退出,而是出栈一次,重新回溯走另一条路径,并用minlen 记录最短路径长度,Path 数组记录最短路径。 ii )程序的数据结构和数据库结构分析 设迷宫为m 行n 列,利用maze[m][n]来表示一个迷宫,maze[i][j]=0或1; 其中:0表示通路,1表示不通,当从某点向下试探时,中间点有4个方向可以试探,(见图)而四个角点有2个方向,其它边缘点有3个方向,为使问题简单化我们用maze[m+2][n+2]来表示迷宫,而迷宫的四周的值全部为1。这样做使问题简单了,每个点的试探方向全部为4,不用再判断当前点的试探方向有几个,同时与迷宫周围是墙壁这一实际问题相一致。 iii 、栈的设计 当到达了某点而无路可走时需返回前一点,再从前一点开始向下一个方向继 续试探。因此,压入栈中的不仅是顺序到达的各点的坐标,而且还要有从前一点到达本点的方向,即每走一步栈中记下的内容为(行,列,来的方向)。对于图1所示迷宫,依次入栈为: 图3 增量数组move

数据结构实验报告 实验名称:实验2——题目3 学生姓名: 班级: 班内序号: 学号: 日期:2012年11月17日 1.实验要求 1.实验目的 通过选择下面五个题目之一进行实现,掌握如下内容: ?进一步掌握指针、模板类、异常处理的使用 ?掌握栈的操作的实现方法 ?掌握队列的操作的实现方法 ?学习使用栈解决实际问题的能力 ?学习使用队列解决实际问题的能力 2 .实验内容 利用栈结构实现迷宫求解问题。迷宫求解问题如下: 心理学家把一只老鼠从一个无顶盖的大盒子的入口赶进迷宫,迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口,测试算法的迷宫如下图所示。 提示: 1、可以使用递归或非递归两种方法实现 2、老鼠能够记住已经走过的路,不会反复走重复的路径 3、可以自己任意设置迷宫的大小和障碍 4、使用“穷举求解”的方法

2. 程序分析 2.1 存储结构 存储结构:顺序栈 data data data top top top (1)空栈 (2)A1A2入栈 (3)A3出栈 2.2 关键算法分析 1.试探方向: (1)基本思想 每个点有4个方向去试探,如当前点的坐标(x , y ),与其相邻的4个点的坐标都可根据与该点的相邻方位而得到,如图所示。因为出口在(m ,n ),因此试探顺序规定为:从当前位置向前试探的方向为从正东沿顺时针方向进行。为了简化问题,方便的求出新点的坐标,将从正东开始沿顺时针进行的这4个方向(用0,1,2,3表示东、南、西、北)的坐标增量放在一个结构数组move [ 4 ]中,在move 数组中,每个元素有两个域组成,x :横坐标增量,y :纵坐标增量。

目录 1 前言 (1) 2 需求分析 (1) 2.1课程设计目的 (1) 2.2课程设计任务 (1) 2.3设计环境 (1) 3 概要设计 (1) 3.1数据结构设计 (1) 3.2模块设计 (2) 4 详细设计 (3) 4.1数据类型的定义................... 错误!未定义书签。 4.2主要模块的算法描述............... 错误!未定义书签。 5 测试分析 (6) 6 课程设计总结 (7) 参考文献 (8) 致谢 (8) 附录(程序代码实现) (9)

1 前言 设计一个简单迷宫程序,从入口出发,按某一方向向前探索,若能走通(未走过的),即某处可以到达,则到达新点,否则试探下一方向;若所有方向均没有通路,则沿原点返回前一点,换下一个方向在继续试探,直到所有可能的通路都探索到,或找到一条通路,或无路可走又返回到入口点。并利用两种方法实现:一种用栈实现,另一种用队列实现。 2 需求分析 2.1课程设计目的 学生在教师指导下运用所学课程的知识来研究、解决一些具有一定综合性问题的专业课题。通过课程设计(论文),提高学生综合运用所学知识来解决实际问题、使用文献资料、及进行科学实验或技术设计的初步能力,为毕业设计(论文)打基础。 2.2课程设计任务 给出一个任意大小的迷宫数据,求出一条走出迷宫的路径,输出迷宫并将所求路径输出。 要求用两种方法实现:一种用栈实现,另一种用队列实现。,我主要负责队列方面 2.3设计环境 (1)WINDOWS 2000/2003/XP/7/Vist a系统 (2)Visual C++或TC集成开发环境 3 概要设计 3.1数据结构设计 (1)迷宫类型 设迷宫为M行N列,利用maze[M][N]来表示一个迷宫,maze=0或1,其中0表示通路,1表示不通。当从某点试探是,中间点有8个不同点可以试探,而四个角有3个方向,其他边缘点有5个方向,为使问题更容易分析我们用maze[M+2][N+2]

上机实验二:迷宫问题求解 1. 用栈实现求迷宫从入口到出口的一条路径(不一定是最短路径) 进一步做的问题: (1)将4方向改为8方向;(2)改用递归函数实现求解(3)换个迷宫测试 typedef struct {int x,y,d;} DataType; struct DirectInc{int dx,dy;} ; const DirectInc move[4]={{0,1},{1,0},{0,-1},{-1,0}}; void mazepath(int maze[10][10]) { DataType temp; int g,h,v,i,j,d; SeqStackS; //栈S已建立 temp.x=1;temp.y=1;temp.d=-1; //入口位置及方向 S.Push(temp); while(!S.Empty()) { temp=S.Pop();i=temp.x;j=temp.y;v=temp.d+1; while(v<4) { g=i+move[v].dx; h=j+move[v].dy; if (maze[g][h]==0) { temp.x=i; temp.y=j; temp.d=v; S.Push(temp); maze[i][j]=-1;i=g;j=h; if (i==N-2 && j==N-2) //是N-2 {S.Print(S); return; } else v=0; } else v++; }//end while (v<4) } //end while(!S.Empty()) } void main() {int maze[N][N]={{1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} }; cout<<"从出口到入口的路径为\n(x y代表坐标代表方向(东0,南1,西2,北3))\nx\ty\td"<

实验二栈在迷宫求解问题中的应用实验项目中文名称:栈在迷宫求解问题中的应用 实验项目英文名称:Application of Stack for Solving Maze Problem 实验学时:2 学时 、实验目的 1、掌握栈的综合应用。 2、掌握迷宫求解的基本算法。 、实验内容 1、编写函数,构造一个栈; 2、编写函数,实现压栈操作; 3、编写函数,实现弹栈操作; 4、编写函数,销毁一个栈; 5、编写函数,求解迷宫; 6、编写函数,展示迷宫的解路径; 、设计概要 1、核心数据结构 1)数据类型:链栈 2)定义方法:定义栈顶和栈底指针以及栈容量 typedef struct sqstack { ElemType *bottom;/* 栈不存在时值为NULL */ ElemType *top; /* 栈顶指针*/ int stacksize ; /* 当前栈容量,以元素为单位*/ }SqStack ; 3)链栈的结构示意图 2、程序框架结构与流程图 (1)程序模块: ·迷宫生产模块:手动生成迷宫。 ·判断结点存在:防止结点的重复访问。 ·路径查找模块:实现通路的查找,返回一条通路。 ·路径输出模块:实现路径以题意要求输出。 (2)程序框架图

流程图:

3、细节设计 (1)坐标位置类型:typedef struct{ int row; // 迷宫中的行

int col; // 的列 }PosType;// 坐标 (2)迷宫类型:typedef struct{ int m,n; int arr[RANGE][RANGE]; }MazeType; // 迷宫类型 co void InitMaze(MazeType &maze, int a[][COL], int row, int l)\ // 设置迷宫的初值,包括边缘一圈的值 Bool MazePath(MazeType &maze,PosType start, PosType end) // 求解迷 宫maze中,从入口start 到出口end 的一条路径 // 若存在,则返回true ,否则返回false Void PrintMaze ( MazeType maze) 我的手机2018/12/519:00:05 // 将迷宫打印出来 (3)栈类型: typedef struct{ int step;// 当前位置在路径上的" 序 号 PosType seat; //当前的坐标位置 DirectiveType di;// 往下一个坐标位置的方向 }SElemType;// 栈的元素类型 typedef struct{ SElemType *base; SElemType *top; int stacksize; }SqStack; 四、程序源代码 #include #include #define SIZE 20 #define ERROR 0 #define OK 1 typedef struct{ int row,col; }PosType; typedef struct{ int ord; PosType seat; int di; } Elemtype; typedef int Statu;

相关文档
最新文档