迷宫问题实验报告用栈解决迷宫问题.doc
《迷宫问题实验报告用栈解决迷宫问题.doc》由会员分享,可在线阅读,更多相关《迷宫问题实验报告用栈解决迷宫问题.doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、_数据结构实验报告题目:用栈解决迷宫问题一 需求分析1 以结构体Maze表示迷宫,其中pos表示该位置是否有障碍; freq记录该位置被经过的次数;数组move表示下一步的方向。2 本程序自动随机生成一个1212大小的迷宫,字符“H”表示有障碍,空符表示通路。3 迷宫的入口为左上角,出口为右下角。4 本程序只求出一条成功的通路。二 概要设计为了实现上述操作,以栈为存储结构。本程序包含三个模块:(1) 主程序模块:实现人机交互。(2) 迷宫生产模块:随机产生一个1212的迷宫。(3) 路径查找模块:实现通路的查找。(4) 求解迷宫中一条通路的伪代码:do 若当前位置可同, 则将当前位置插入栈顶;
2、若该位置是出口位置,则结束;否则切换当前位置的东临方块为新的当前位置; 否则若栈不空且栈顶位置尚有其他方向未被探索,则设定新的的当前位置为沿顺时针方向旋转找到的栈顶位置的下一相邻块若栈不空但栈顶位置的四周均不可通,则 删去栈顶位置; 若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈至栈空。 while(栈不空)三 详细设计栈的设计:typedef struct Node *base,*top;int length;Stack;Stack *initstack(); /初始化栈void printstack(Stack *s); /打印栈Status destroy(Stack
3、*); /销毁整个栈Status deltop(Stack *s); /出栈Status pushelem(Stack *,ElemType ,ElemType); /进栈 1. 主程序模块: int main() printf(随机产生一个1212的迷宫,X字符表示障碍,空符表示通路:n); Maze aNN; makemaze(a); printf(输入回车键显示路径,*字符表示路径。n); getchar(); findpath(a); while(1); return 0;2. 迷宫生产模块; void makemaze(Maze (*p)N) int i,j,conter; for(
4、i=0;iN;+i) for(j=0;jpos=0; (*(p+i)+j)-freq=0; (*(p+i)+j)-move0=0; (*(p+i)+j)-move1=0; (*(p+i)+j)-move2=0; (*(p+i)+j)-move3=0; for(j=0;jpos=X; (*(p+N-1)+j)-pos=X; for(i=1;ipos=X; (*(p+i)+N-1)-pos=X; srand(int)time(NULL); for(conter=0;conterpos=X; if(i=1&j=1|i=N-1&j=N-1) (*(p+i)+j)-pos=0; printmaze(p)
5、;3.路径查找模块。Maze *testnewpos(Maze (*p)N,Stack *s,int *i,int *j)Maze *q=NULL;int select=0;*i=*j=0;for(;q=NULL&selecttop-x)+s-top-y)-move0!=1 ) (*(p+s-top-x)+s-top-y)-move0=1; q=*(p+s-top-x)+s-top-y+1; *i=s-top-x+0; *j=s-top-y+1; / 退回前一步检查东方向是否可通 break; case 1: if( (*(p+s-top-x)+s-top-y)-move1!=1 ) (*(p
6、+s-top-x)+s-top-y)-move1=1; q=*(p+s-top-x+1)+s-top-y; *i=s-top-x+1; *j=s-top-y+0; / 退回前一步检查南方向是否可通 break; case 2: if( (*(p+s-top-x)+s-top-y)-move2!=1 ) (*(p+s-top-x)+s-top-y)-move2=1; q=*(p+s-top-x)+s-top-y-1; *i=s-top-x+0; *j=s-top-y-1; / 退回前一步检查西方向是否可通 break; case 3: if( (*(p+s-top-x)+s-top-y)-mov
7、e3!=1 ) (*(p+s-top-x)+s-top-y)-move3=1; q=*(p+s-top-x-1)+s-top-y; *i=s-top-x-1; *j=s-top-y+0; / 退回前一步检查北方向是否可通 return q;void printpath(Stack *s,Maze (*p)N) Node *n;int i,j,conter;conter=0;n=s-base;for(;n;n=n-next) (*(p+n-x)+n-y)-pos=*; for(i=0;iN;+i) for(j=0;jpos); if(conter%12=0) TURNLINE; TURNLINE
8、; 完整的程序:maze.h#ifndef MAZE_H#define MAZE_H#include mazepath.h#include #define N 12/10+2#define FORMAT %2c#define TURNLINE printf(n)typedef structchar pos;int freq;int move4;Maze;void makemaze(Maze (*p)N);void printmaze(Maze (*p)N);void findpath(Maze (*p)N);Maze *testnewpos(Maze (*p)N,Stack *,int *,i
9、nt *);void printpath(Stack *s,Maze (*p)N);void makemaze(Maze (*p)N) int i,j,conter; for(i=0;iN;+i) for(j=0;jpos=0; (*(p+i)+j)-freq=0; (*(p+i)+j)-move0=0; (*(p+i)+j)-move1=0; (*(p+i)+j)-move2=0; (*(p+i)+j)-move3=0; for(j=0;jpos=X; (*(p+N-1)+j)-pos=X; for(i=1;ipos=X; (*(p+i)+N-1)-pos=X; srand(int)time
10、(NULL); for(conter=0;conterpos=X; if(i=1&j=1|i=N-1&j=N-1) (*(p+i)+j)-pos=0; printmaze(p);void printmaze(Maze (*p)N)int i,j,conter;conter=0;for(i=0;iN;+i) for(j=0;jpos); if(conter%12=0) TURNLINE; TURNLINE;void findpath(Maze (*p)N) Maze *q=NULL; int i=1,j=1,*pi=&i,*pj=&j,success=0; Stack *s; s=initsta
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 问题 实验 报告 解决
限制150内