1、数据结构课程设计报告设计题目: 迷宫问题数据结构课程设计 _ 班 级: 计科 152 学 号: 19215225 姓 名: 徐昌港 南京农业大学计算机系数据结构课程设计报告内容1课程设计题目迷宫问题以一个 m*n 的长方阵表示迷宫,0 和 1 分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。要求:首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d 表示走到下一坐标的方向。二算法设计思想1.需求分析(1)迷宫数据用一个二维数组in
2、t mazerowcol来存储,在定义了迷宫的行列数后,用两个for循环来录入迷宫数据,并在迷宫周围加墙壁。(2)迷宫的入口位置和出口位置可以由用户自己决定。2.概要设计(1)主程序模块:void main()int mazerowcol;struct mark start,end; /出入口的坐标int dir42=0,1,1,0,0,-1,-1,0;/方向,依次是东西南北built_maze(maze);printf(“请输入入口的横纵坐标:“);scanf(“%d,%d“,printf(“请输入出口的横纵坐标:“);scanf(“%d,%d“,printf(“0为东,1为南,2为西,3为
3、北,-1为出路n“);maze_path(maze,dir,start,end);getchar();(2)栈模块实现栈抽象数据类型(3)迷宫模块实现迷宫抽象数据类型,建立迷宫,找出迷宫的一条通路3.详细设计(1)坐标位置类型struct markint a,b; /迷宫a行b列为位置;(2)迷宫类型void built_maze(int mazerowcol)/按照用户输入的row行和col列的二维数组(元素值为0和1)/设置迷宫maze的初值,包括边上边缘一圈的值void maze_path(int mazerowcol,int dir42,struct mark start,struct
4、 mark end)/求解迷宫maze中,从入口start到出口end的一条路径,/若存在,则返回TRUE;否则返回FALSE(3)栈类型struct elementint i,j,d; /坐标与方向;typedef struct Linkstackelement elem;struct Linkstack *next;*SLinkstack;4.求迷宫路径为伪码算法void maze_path(int mazerowcol,int dir42,struct mark start,struct mark end)int i,j,d;int x,y;element elem,E;SLinksta
5、ck L1,L2;initstack(L1);initstack(L2);mazestart.astart.b=2;elem.i=start.a;elem.j=start.b;elem.d=-1; /d=-1表示无方向push_stack(L1,elem);while(!stack_empty(L1)pop(L1,elem);i=elem.i;j=elem.j;d=elem.d+1; /下一个方向while(d#include#define row 100#define col 100struct markint a,b;struct elementint i,j,d; /坐标与方向;type
6、def struct Linkstackelement elem;struct Linkstack *next;*SLinkstack;int initstack(SLinkstack return 1;int stack_empty(SLinkstack L)if(L=NULL)return 1;elsereturn 0;int push_stack(SLinkstack P=(SLinkstack)malloc(sizeof(Linkstack);P-elem=E;P-next=L;L=P;return 1;int pop(SLinkstack if(!stack_empty(L)E=L-
7、elem;P=L;L=L-next;free(P);return 1;elsereturn 0;void built_maze(int mazerowcol)/建立迷宫int x,y;int m,n;printf(“请输入迷宫的行列数(用逗号隔开):“);scanf(“%d,%d“,printf(“请输入迷宫各行各列的数据(用空格隔开):n“);for(x=0;xm+2;x+)for(y=0;yn+2;y+)if(x=0|x=m+1|y=0|y=n+1)/迷宫周围加墙壁mazexy=1;elsescanf(“%d“,printf(“迷宫生成中n“);printf(“迷宫显示为:n“);for(
8、x=0;xm+2;x+)for(y=0;yn+2;y+)printf(“%3d“,mazexy);printf(“n“);void maze_path(int mazerowcol,int dir42,struct mark start,struct mark end)int i,j,d;int x,y;element elem,E;SLinkstack L1,L2;initstack(L1);initstack(L2);mazestart.astart.b=2; /标记起点坐标elem.i=start.a;elem.j=start.b;elem.d=-1; /d=-1 表示无方向push_s
9、tack(L1,elem);while(!stack_empty(L1)pop(L1,elem);i=elem.i;j=elem.j;d=elem.d+1; /下一个方向while(d4) /探索东西南北各个方向x=i+dird0;y=j+dird1;if(x=end.aelem.j=j;elem.d=d;push_stack(L1,elem);elem.i=x;elem.j=y;elem.d=-1;push_stack(L1,elem);while(L1) /逆置序列,输出迷宫路径pop(L1,E);push_stack(L2,E);while(L2)pop(L2,E);printf(“(%
10、d,%d,%d)n“,E.i,E.j,E.d);return;if(mazexy=0)mazexy=2; /标记走过这个点elem.i=i;elem.j=j;elem.d=d;push_stack(L1,elem);i=x;j=y;d=-1;d+;printf(“此迷宫无出路“);void main()int mazerowcol;struct mark start,end; /出入口的坐标int dir42=0,1,1,0,0,-1,-1,0; /方向,依次是东西南北printf(“*n“);printf(“t* 欢迎使用迷宫模拟程序 *n“);printf(“*n“);built_maze(maze);printf(“请输入入口的横纵坐标:“);scanf(“%d,%d“,printf(“请输入出口的横纵坐标:“);scanf(“%d,%d“,printf(“0 为东,1 为南,2 为西,3 为北,-1 为出路n“);maze_path(maze,dir,start,end);printf(“按任意键继续“);getchar();