51CTO下载-迷宫问题数据结构课程设计报告
数据结构迷宫问题课程设计

数据结构课程设计报告设计题目:迷宫问题数据结构课程设计_班级:计科152学号:*********名:***南京农业大学计算机系数据结构课程设计报告内容一.课程设计题目迷宫问题以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
要求:首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出。
其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
二.算法设计思想1.需求分析(1)迷宫数据用一个二维数组int maze[row][col]来存储,在定义了迷宫的行列数后,用两个for循环来录入迷宫数据,并在迷宫周围加墙壁。
(2)迷宫的入口位置和出口位置可以由用户自己决定。
2.概要设计(1)主程序模块:void main(){int maze[row][col];struct mark start,end; //出入口的坐标int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//方向,依次是东西南北built_maze(maze);printf("请输入入口的横纵坐标:");scanf("%d,%d",&start.a,&start.b);printf("请输入出口的横纵坐标:");scanf("%d,%d",&end.a,&end.b);printf("0为东,1为南,2为西,3为北,-1为出路\n");maze_path(maze,dir,start,end);getchar();}(2)栈模块——实现栈抽象数据类型(3)迷宫模块——实现迷宫抽象数据类型,建立迷宫,找出迷宫的一条通路3.详细设计(1)坐标位置类型struct mark{int a,b; //迷宫a行b列为位置};(2)迷宫类型void built_maze(int maze[row][col])//按照用户输入的row行和col列的二维数组(元素值为0和1)//设置迷宫maze的初值,包括边上边缘一圈的值void maze_path(int maze[row][col],int dir[4][2],struct mark start,struct mark end)//求解迷宫maze中,从入口start到出口end的一条路径,//若存在,则返回TRUE;否则返回FALSE(3)栈类型struct element{int i,j,d; //坐标与方向};typedef struct Linkstack{element elem;struct Linkstack *next;}*SLinkstack;4.求迷宫路径为伪码算法void maze_path(int maze[row][col],int dir[4][2],struct mark start,struct mark end){int i,j,d;int x,y;element elem,E;SLinkstack L1,L2;initstack(L1);initstack(L2);maze[start.a][start.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<4) //探索东西南北各个方向{x=i+dir[d][0];y=j+dir[d][1];if(x==end.a&&y==end.b&&maze[x][y]==0) //这里表示已经到了出口{elem.i=i;elem.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("%3d%3d%3d\n",E.i,E.j,E.d);}return;}if(maze[x][y]==0){maze[x][y]=2; //标记走过这个点elem.i=i;elem.j=j;elem.d=d;push_stack(L1,elem);i=x;j=y;d=-1;}d++;}}printf("此迷宫无出路");}5.主函数和其他函数的伪码算法void main(){int maze[row][col];struct mark start,end; //出入口的坐标int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};built_maze(maze); //方向,依次是东西南北printf("请输入入口的横纵坐标:");scanf("%d,%d",&start.a,&start.b);printf("请输入出口的横纵坐标:");scanf("%d,%d",&end.a,&end.b);printf("0为东,1为南,2为西,3为北,-1为出路\n");maze_path(maze,dir,start,end);getchar();}三.程序结构主程序built_maze maze_pathinitstack push_stack pop stack_empty四.实验结果与分析1.用户使用说明(1)本程序的运行环境为debug运行环境,执行文件为:19215225.cpp;(2)用VC++运行文件后出现以下窗口:点击运行程序(3)出现以下窗口后输入迷宫的行列数,回车;再继续输入迷宫的数据,1表示障碍,0表示通路;再输入入口坐标和出口坐标,回车。
迷宫问题-数据结构与算法课程设计报告

合肥学院计算机科学与技术系课程设计报告2008 ~2009 学年第二学期课程数据结构与算法课程设计名称迷宫问题学生名称陈建华专业班级08计本(2)班指导教师王昆仑2010年6月一、问题分析和任务定义1.题目:迷宫的生成与路由。
生成一个N*M(N行M列)的迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,完成迷宫的组织与存储,并实现迷宫的路由算法。
即对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论2.设计要求:(1)N和M是用户可配置的,缺省值为50和50。
(2)迷宫的入口和出口分别在左上角和右下角。
(3)求得的通路以二元组( i , j )的形式输出,其中(i, j)指示迷宫中的一个坐标。
(4) 以二维数组存储迷宫数据。
3.问题描述:迷宫是一个矩形区域如图(a)所示,它有一个入口和一个出口,其内部包含能穿越的强或障碍。
迷宫老鼠问题就是要寻找一条从入口到出口的路径。
对这样的矩形迷宫,可以用N*M的矩阵来描述,N和M分别代表迷宫的行数和列数。
这样,迷宫中的每一个位置都可以用行号和列号来指定。
(1,1)表示入口位置,(n,m)表示出口位置;从入口到出口的路径则是由一个位置构成的,每个位置上都没有障碍,且每个位置(第一个除外)都是前一个位置的东、南、西或北的邻居。
为了描述迷宫中位置(i,j)处有无障碍,规定:当位置(i,j)处有一个障碍时,其值为1,否则为0。
这样,如图(a)所示的迷宫就可以用图(b)所示的矩阵来描述。
其中,a11=0表示入口,anm=0表示出口;若aij表示从入口到出口路径上的某个位置,则应该有aij=0经分析,一个简单的求解方法是:从入口出发,沿某一方向进行探索,若能走通,则继续向前走;否则沿原路返回,换一方向再进行搜索,直到所有可能的通路都探索到为止。
即0 1 1 1 1 1 0 0 0 00 0 0 0 0 1 0 1 0 00 0 0 1 0 1 0 0 0 00 1 0 1 0 1 0 1 1 00 1 0 1 0 1 0 1 0 00 1 1 1 0 1 0 1 0 10 1 0 0 0 1 0 1 0 10 1 0 1 1 1 0 1 0 01 0 0 0 0 0 0 1 0 00 0 0 0 0 1 1 1 0 0(a) (b)4.测试用例:手动绘制迷宫正确的输入数据:0 0 0 0 1 01 1 1 0 1 00 1 0 0 0 11 0 1 1 1 1手动绘制迷宫正确的输出结果:随机绘制迷宫错误的输出结果:此迷宫没有通路!注:用一个二维数组表示迷宫,数组中的每个元素表示一个小方格,0和1分别表示迷宫中的通路和障碍。
数据结构毕业课程设计报告—迷宫求解问题

课题设计1:迷宫求解一. 需求分析:本程序是利用非递归的方法求出一条走出迷宫的路径,并将路径输出。
首先由用户输入一组二维数组来组成迷宫,确认后程序自动运行,当迷宫有完整路径可以通过时,以0和1所组成的迷宫形式输出,标记所走过的路径结束程序;当迷宫无路径时,提示输入错误结束程序。
二、概要设计:1.抽象数据类型定义:ADT Find{数据对象:D={ai?ai ∈ElemSet,i=1,2,…,n,n≥0}数据关系:R1={<ai-1,ai>?ai-1, ai∈D }基本操作:find (&S)初始条件:已初始化栈S,且栈为空操作结果:从栈S中找出相对应的数据关系,并输出结果}ADT Find2. 主程序的流程以及各程序模块之间的调用关系:(1).定义变量i、j、w、z为整形变量(2).输入迷宫二维数组maze(0:m,0:n)(3).调用子程序find ()(4).结束程序三、相应的源程序如下:#include<stdio.h>#include<stdlib.h>typedef enum { ERROR, OK } Status;typedef struct{int row, line;}PosType;typedef struct{int di, ord;PosType seat;}SElemType;typedef struct{SElemType * base;SElemType * top;int stacksize;}SqStack;Status InitStack(SqStack &S);Status Push(SqStack &S,SElemType &a);Status Pop(SqStack &S,SElemType &a);Status StackEmpty(SqStack S);Status MazePath(int maze[12][12],SqStack &S, PosType start, PosType end);void Initmaze(int maze[12][12],int size);void printmaze(int maze[12][12],int size);Status Pass(int maze[12][12],PosType CurPos);void Markfoot(int maze[12][12], PosType CurPos);PosType NextPos(PosType CurPos, int Dir);void printpath(int maze[12][12],SqStack S,int size);void main (void){SqStack S;int size,maze[12][12];for(int n=0;n<10;n++){printf("创建一个正方形迷宫,请输入迷宫尺寸(注意不要大于50):\n");scanf("%d",&size);if(size<1 || size>10){printf("输入错误!");return;}Initmaze(maze,size);printmaze(maze,size);PosType start,end;printf("输入入口行坐标和列坐标:");scanf("%d",&start.row);scanf("%d",&start.line);printf("输入出口行坐标和列坐标:");scanf("%d",&end.row);scanf("%d",&end.line);if(MazePath(maze,S,start,end))printpath(maze,S,size);else printf("找不到通路!\n\n");}}Status MazePath(int maze[12][12],SqStack &S, PosType start, PosType end){PosType curpos;int curstep;SElemType e;InitStack(S);curpos = start;curstep = 1;do {if (Pass(maze,curpos)){Markfoot(maze,curpos);e.di =1;e.ord = curstep;e.seat= curpos;Push(S,e);if (curpos.row==end.row && curpos.line==end.line)return OK;curpos = NextPos(curpos, 1);curstep++;}else{if (!StackEmpty(S)){Pop(S,e);while (e.di==4 && !StackEmpty(S)) {Markfoot(maze,e.seat);Pop(S,e);}if (e.di<4){e.di++;Push(S, e);curpos = NextPos(e.seat, e.di);}}}} while (!StackEmpty(S));return ERROR;}void Initmaze(int maze[12][12],int size){char select;printf("选择创建方式A:自动生成B:手动创建\n");label:scanf("%c",&select);if(select=='a'||select=='A'){for(int i=0;i<size+2;i++)maze[0][i]=1;for( i=1;i<size+1;i++){maze[i][0]=1;for(int j=1;j<size+1;j++)maze[i][j]=rand()%2;maze[i][size+1]=1;}for(i=0;i<size+2;i++)maze[size+1][i]=1;}else if(select=='b'||select=='B'){printf("按行输入%d*%d数据,0代表可通,1代表不可通(每行以Enter结束):\n",size,size);for(int i=0;i<size+2;i++)maze[0][i]=1;for( i=1;i<size+1;i++){maze[i][0]=1;for(int j=1;j<size+1;j++)scanf("%d",&maze[i][j]);maze[i][size+1]=1;}for(i=0;i<size+2;i++)maze[size+1][i]=1;}else if(select=='\n')goto label;else printf("输入错误!");}void printmaze(int maze[12][12],int size){printf("\n\n");printf("显示所建的迷宫(#表示外面的墙):\n");for(int i=0;i<size+2;i++)printf("%c ",'#');printf("\n");for(i=1;i<size+1;i++){printf("%c ",'#');for(int j=1;j<size+1;j++){printf("%d ",maze[i][j]);}printf("%c",'#');printf("\n");}for(i=0;i<size+2;i++)printf("%c ",'#');printf("\n");}void printpath(int maze[12][12],SqStack S,int size){printf("\n\n通路路径为:\n");SElemType * p=S.base;while(p!=S.top){maze[p->seat.row][p->seat.line]=2;p++;}for(int i=0;i<size+2;i++)printf("%c ",'#');printf("\n");for(i=1;i<size+1;i++){printf("%c ",'#');for(int j=1;j<size+1;j++){if(maze[i][j]==2) printf("%c ",'0');else printf(" ");}printf("%c",'#');printf("\n");}for(i=0;i<size+2;i++)printf("%c ",'#');printf("\n\n"); }Status Pass(int maze[12][12],PosType CurPos){if (maze[CurPos.row][CurPos.line]==0)return OK;else return ERROR;}void Markfoot(int maze[12][12],PosType CurPos){maze[CurPos.row][CurPos.line]=1;}PosType NextPos(PosType CurPos, int Dir){PosType ReturnPos;switch (Dir){case 1:ReturnPos.row=CurPos.row;ReturnPos.line=CurPos.line+1;break;case 2:ReturnPos.row=CurPos.row+1;ReturnPos.line=CurPos.line;break;case 3:ReturnPos.row=CurPos.row;ReturnPos.line=CurPos.line-1;break;case 4:ReturnPos.row=CurPos.row-1;ReturnPos.line=CurPos.line;break;}return ReturnPos;}Status InitStack(SqStack &S){S.base=(SElemType *)malloc(100*sizeof(SElemType));if(!S.base)return ERROR;S.top=S.base;S.stacksize=100;return OK;}Status Push(SqStack &S,SElemType &a){*S.top++=a;return OK;}Status Pop(SqStack &S,SElemType &a){if(S.top==S.base)return ERROR;a=*--S.top;return OK;}Status StackEmpty(SqStack S){if(S.top==S.base)return OK;return ERROR;}以下为测试数据:输入一个矩阵,例如:1 0 0 1 10 0 1 1 11 0 0 0 10 1 0 1 11 1 0 0 0输入入口行坐标和列坐标:1 2输入出口行坐标和列坐标:5 5通路路径为:课题设计3:joseph环一. 需求分析:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
迷宫求解数据结构课程设计报告

课程设计报告课题名称:迷宫问题姓名:xxx学号:200816020239专业:电气与信息工程学院班级:通信08102指导教师:目录第一部分程告⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 3第一章程目的⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 3第二章程内容和要求⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 4描述⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 4要求⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 4第三章程体方案及解析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 4解析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 4大纲⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯7⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯7解析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯10果⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯10参照文件⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯12 第二部分程⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯13附 (源代 )⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯14第二部分课程设计报告第一章课程设计目的到列是一种特其他性表是不的,本次的目的在于使学生深入认识列的特色,以便在背景下灵便运用它,同将牢固种数据构的构造方法第二章课程设计内容和要求2.1 问题描述:迷是取自心理学的一个古典。
在中,把一只老鼠从一个无大盒子的放入,在盒子中置了多,行方向形成了多阻。
盒子有一个出口,在出口放置一奶酪,吸引老鼠在迷中找道路以到达出口。
同一只老鼠重复行上述,向到达老鼠从入口走到出口,而不走一步。
老鼠多次最学会走通迷的路。
一个算机程序任意定的矩形迷以下 A 所示,求出一条从入口到出口的通路,或得出没有通路的。
A2.2 设计要求:要求设计程序输出以下:(1)成立一个大小为 m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏幕上显示出来;(2 )找出一条通路的二元组(i,j )数据序列,( i,j )表示通路上某一点的坐标。
(3 )用一种标志(如数字8 )在迷宫中标出该条通路;(4 )在屏幕上输出迷宫和通路;(5 )上述功能可用菜单项选择择。
走迷宫 数据结构课程设计报告

西安邮电大学题目:迷宫问题院系名称:计算机学院专业名称:计算机科学与技术班级:计科1102班学号:04111067(24)学生姓名:冯佳新一、课程设计目的1, 深入了解栈的特征及数据结构。
2, 了解迷宫问题的提出背景以及试探法的求解思路。
3, 设计实现一个完整的迷宫求解程序。
二、课程设计内容迷宫是实验心理学中一个古典问题。
用计算机解迷宫路径的程序,就是仿照人走迷宫。
计算机解迷宫时,通常用的是"穷举求解"的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。
三、需求分析1,电脑自动存储迷宫,先将m*n迷宫先输入在文件中,通过输入文件名(*.txt),将该迷宫在屏幕上显示出来,选择通路。
2,由用户自己手动创建迷宫,将创建好的m*n迷宫保存在文件(*.txt)中,选择通路。
3,用“回溯法”来寻找通路,借用一个move[4]数组来存储四个方向,数组的i,j两个域分别表示行列位移的增量,在通过栈的相关操作来求解通路。
4,最终的解要求在屏幕上显示并存入文件(*.txt)中。
四、概要设计1.系统结构图2.功能模块说明1,定义相关的结构体。
2,关于栈的操作,入栈,出栈,判空栈,销毁栈。
3,先在文本文件中创建好一个迷宫,然后显示在屏幕上,寻找通路并保存。
4,用户自己手动创建好一个迷宫,并保存在文件中,然后寻找通路并保存。
5,利用菜单选择自己创建迷宫的方式。
五、详细设计及运行结果1,主要的流程图2,重要的程序,Seekpath 的主要算法 //寻找迷宫路径并保存void Seekpath(char maze[Max][Max]) {int i, j, d, x, y, m, n;Seqstack *S;FILE *fp;Item move[4];Elemtype t;fp=fopen("路径.txt","wt");S = (struct stack *)malloc(sizeof(struct stack));InitStack(S);move[0].i = 0; move[0].j = 1; //move[4]数组的初始化move[1].i = 1; move[1].j = 0;move[2].i = 0; move[2].j = -1;move[3].i = -1;move[3].j = 0;d = 0;printf("请输入您想出的出口.\n");scanf("%d %d",&m,&n);printf("请输入您想进的入口. \n");scanf("%d",&t.i);t.j = 1;t.d = -1; //初始方向为-1if(S==NULL){printf("error!");return;}PushStack(S, t); //栈里的第一个元素就是入口点while(!EmptyStack(S)){PopStack(S, &t); //第一个元素出栈i = t.i;j = t.j;d = t.d +1; //下一个方向while(d<4) //开始试探东南西北四个方向{x = i+move[d].i;y = j+move[d].j; //试探后的新坐标if(maze[x][y] == '0'){t.i = i;t.j = j;t.d = d;PushStack(S, t); //可以走的坐标入栈i=x; j=y;maze[i][j] = -1; //已走过的路置为-1if(m==i && n==j) //判断是否到了出口{printf("通路为:\n"); //将走通的路径打印出来printf("(%2d,%2d) <==",m, n);fprintf(fp,"%2d,%2d",m,n); //将m,n的值按%2d和%2d的格式输出到fp指向的文件上while(!EmptyStack(S) && S->top!=0){PopStack(S, &t);printf("(%2d,%2d) <== ",t.i,t.j);fputs("<==",fp);fprintf(fp,"%2d,%2d",t.i,t.j);}if(S->top==0)PopStack(S, &t);printf("(%2d,%2d) ",t.i,t.j);printf("\n路径已保存!\n");fputs("<==",fp);fprintf(fp,"%2d,%2d",t.i,t.j);DestoryStack(&S); //所有的元素出栈之后销毁栈return;}elsed=0;}elsed++;}}DestoryStack(&S);printf("该迷宫不能走通!\n");fclose(fp);return ;}3,运行结果(1),文本文件中提前存储好迷宫,然后选择通路。
迷宫课程设计报告

目录引言 (1)一.设计目的 (2)二.问题描述 (2)三.需求分析 (3)四.设计 (3)五.测试分析 (5)六.完整代码 (10)七.设计体会与小结 (17)八、成绩: (17)引言数据结构的学习过程,是进行复杂程序设计的训练过程,是算法构造性思维方法的训练过程,技能培养的过程不亚于知识传授。
数据结构课程教学的重要内容和主要难点在于让我们理解、习惯算法构造性思维方法。
培养我们的数据抽象能力、算法设计能力以及创造性思维方法,才能够举一反三、触类旁通,从而达到应用知识解决复杂问题的目的。
数据结构作为专业基础课程,可以对去年学习的c语言知识进行总结提高,为后续专业基础课程提供基础,它承上启下,贯通始终,是计算机科学与技术人才素质框架中的脊梁,对我们能力的培养至关重要。
通过对数据结构的学习,我们能够以问题求解方法、程序设计方法及一些典型的数据结构算法为对象,学会分析数据对象特征,掌握数理算法,初步掌握算法的时间、空间复杂分析基础,培养良好的程序设计风格以及进行复杂程序设计的技能。
一.设计目的这次课程设计,我们的题目是迷宫求解。
迷宫求解是数据结构中的经典问题,我期望达到的目的有以下4个。
1.巩固书本知识,对书上的知识能更透彻的了解.通过自己设计程序积累调试数据结构的经验,培养我们的编程能力。
巩固我们所学的数据结构知识,消化课堂所讲解的内容。
也是对所学知识的整理,将原来在我们脑中比较混乱的课程设计重新梳理。
2.通过课程设计能更好的掌握迷宫求解中的设计思路,为以后灵活运用奠定基础。
3.能够独立的完成简单程序的设计以及完成一份较为满意的程序设计报告。
4.通过课程设计达到增强巩固数据结构知识的目的,使知识全面化、系统化。
二.问题描述迷宫问题来源于古希腊的神话,而后被人们演化为一个游戏。
以一个N*M的方正表示迷宫,0、1分别表示迷宫中的通路和障碍。
设计一个程序对任意设定的迷宫求出一条从入口的通道,或者的出没有通路的结论。
迷宫问题 课程设计报告

目录目录 (1)第一章设计目的和意义 (2)1.1目的 (2)1.2意义 (2)第二章设计内容 (3)2.1问题描述和需求分析 (3)2.2 数据结构设计 (3)2.2.1 数据结构设计考虑 (3)2.2.2. 逻辑结构存储结构 (3)2.3算法设计 (4)2.3.1 程序的模块 (4)第三章详细设计 (5)3.1栈的顺序存储实现 (5)3.2栈的基本操作的算法实现 (5)第四章迷宫求解调试及运行结果 (8)第五章心得体会 (10)第六章参考文献 (11)致谢 (12)附录 (12)源程序 (12)第一章设计目的和意义1.1 目的这次课程设计,我们的题目是迷宫求解。
迷宫求解是数据结构中的经典问题,我期望达到的目的有四个:1) 巩固书本知识,对书上的知识能更透彻地了解。
通过自己设计程序积累调试数据结构的经验,培养我们的编程能力。
巩固我们所学的数据结构知识,消化课堂所讲解的内容。
也是对所学知识的一次整理,将原本在我们脑中比较混乱的课程设计重新梳理。
2) 通过课程设计能够更好的掌握迷宫求解中的设计思路为以后灵活运用奠定基础。
3) 能够独立的完成简单程序的设计以及完成一份较为满意的程序设计报告4) 通过课程设计,达到增强巩固数据结构知识的目的,使知识全面化,系统化。
1.2 意义数据结构课程设计是学习数据结构课程的一个重要环节。
能巩固和加深课堂教学内容,提高学生实际工作能力,培养科学作风,为学习后续课程和今后的系统开发奠定基础。
通过课程设计,使学生熟练掌握数据结构课程中所学的理论知识,并实际应用,通过综合运用数据结构的基本知识来解决实际问题,加强学生分析和解决问题的能力。
课程设计比教学实验更复杂一些,深度更广并更加接近实际应用。
通过课程设计的综合训练,培养我们学生实际分析问题、编程和动手能力,最终帮助我们学生系统把握课程的主要内容,更好地完成教学任务。
第二章设计内容2.1 问题描述和需求分析首先,在计算机中可以用方块图表示迷宫。
《数据结构》课程设计报告迷宫求解

课程设计任务书题目:迷宫设计学号:姓名:专业:网络技术课程:数据结构指导教师:职称:讲师完成时间:2013年12 月----2014 年1 月年月日课程设计任务书及成绩评定目录一.迷宫求解································(1)问题描述···········································(2)需求分析及设计思路·································(3)数据结构定义········································(4)系统功能模块介绍····································(5)源代码··············································(6)运行结果及调试分析································(7)课程设计总结·····························一.迷宫求解(1)问题描述输入一个任意大小的迷宫数据,用递归和非递归两种方法求出一条走出迷宫的路径,并将路径输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一.设计任务的详细描述 (2)二.系统所完成的功能描述 (2)三.所采用的设计思想、方法及方案 (2)四.测试数据与测试结果 (6)五.课程设计总结与体会 (9)六.项目工程组成 (10)七.源代码 (10)一.设计任务的详细描述程序开始运行时显示一个迷宫地图,迷宫中有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。
要求:(1)老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;(2)迷宫的墙足够结实,老鼠不能穿墙而过;(3)正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;(4)添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;(5)找出走出迷宫的所有路径,以及最短路径。
提高部分:利用序列化功能实现迷宫地图文件的存盘和读出等功能二.系统所完成的功能描述将迷宫抽象为一个二维数组,左上角入口,右下角出口,在规定的时间内,从入口走到出口就成功;0表示路,1表示墙,6表示老鼠,且老鼠不能够穿过墙体,但在游戏过程中我设置了外挂,当玩家找不到路时可以根据自己的想法来改变墙体和路径的方法来到达出口。
游戏可以自动寻找所有路径和最短路径,并且输出该条路径应该怎么去走(以坐标的方法去表示)。
系统输出菜单,包括开始游戏,游戏说明(包括游戏操作和更改方法),读取记录和上一次的游戏记录。
用户可在开始游戏后选择游戏难度(即定义迷宫大小从1到15,边长为输入数字的2倍),将小矩阵一一对应这迷宫中形成一个图,利用图的DFS算法思想随机产生二维数组作为迷宫。
用w、a、s、d控制移动方向,w代表向上移动一格,a代表向左移动一格,s代表乡下移动一格,d代表向右移动一格,即进行数组数字的交换;开始游戏时计时60秒;游戏过程中输入‘c’便提示选择一行或者一列来改变,可以是墙边长路,也可以是路变成墙,由玩家用户选择控制改变情况;能够自动找出路径和最短的路径;游戏中途退出能自动保存记录,记录保存在record.txt中,可读取记录,也是在record.txt中读取。
若在规定的时间内完成游戏,最后提示victor;若超出了游戏时间,系统会显示出游戏所用的总时间,并且提示游戏失败;三.所采用的设计思想、方法及方案将迷宫游戏的程序分为5个cpp,分别实现创建迷宫,游戏操作,自动寻路,游戏实现和主函数的功能,下面对5个cpp分别进行说明:(一)CreatMaze.cpp中包含的是创建迷宫的墙,路和显示迷宫的函数:1.void CreatMaze(int (*mg)[N],int x)创建一个边长是2*x+3的迷宫,并设置好墙和路。
2.void creatWay(int (*mg)[N],int x, int y)在迷宫中产生一条路,使用图的深度遍历思想来实现,通过x*x上的每个点(i,j)对应上(2*x+3)* (2*x+3)上的(2*i,2*j),通过随机的DFS 对这些点进行遍历。
具体算法如下:void creatWay(int (*mg)[N],int x, int y){static int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};int zx = x*2;int zy = y*2;int next, turn, i;mg[zx][zy] = 0;if(rand()%2)turn = 1;elseturn = 3;for(i=0,next=rand()%4;i<4;i++,next=(next+turn)%4)if(mg[zx+2*dir[next][0]][zy+2*dir[next][1]] == 1){mg[zx+dir[next][0]][zy+dir[next][1]] = 0;creatWay(mg,x+dir[next][0], y+dir[next][1]);}}3. void show(int (*mg)[N],int x)输出当前迷宫的形状。
即输出二维数组(二)Search.cpp中实现的是迷宫路径的查找,可查找全部路径和最短路径。
函数注释与实现:#define MAXSIZE 200#define N 52const int move[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//将要走的4个方向保存在二维数组中typedef struct//定义一个结构体,存放走过的路径和将要走下一步的方向{int i,j;//当前点的坐标int di; //下个步要走的方向}Stack;Stack st[MAXSIZE],Path[MAXSIZE];void PutOut_all(int(*mg)[N],int x)//寻找所有路径,输出所有路径和最短路径。
{int top=-1,count=1,minlen=MAXSIZE;int i,j,di,find,k;mg[0][2]=1;top++;//将起点进栈st[top].i=1;st[top].j=2;st[top].di=-1;mg[1][2]=-1;//走过的地方置为-1while(top>-1) //寻找路径{i=st[top].i;j=st[top].j;di=st[top].di;if(i==(2*x+1)&&j==2*x) //找到一条路径则输出{printf("-----------------------------------------------------\n");printf("路径%d:",count++);printf("(%d,%d)",st[0].i,st[0].j);for(k=1;k<=top;k++){printf("->(%d,%d)",st[k].i,st[k].j);if((k+1)%5==0)printf("\n");}printf("\n");if(top+1<minlen) //比较路径的长度,将最短路径放入Path中{for(k=0;k<=top;k++)Path[k]=st[k];minlen=top+1;}mg[st[top].i][st[top].j]=0;top--;i=st[top].i;j=st[top].j;di=st[top].di; //退一个,寻找下一跳路径}find=0;while(di<4&&find==0) //确定将要移动的方向及路程{di++;i=st[top].i+move[di][0];j=st[top].j+move[di][1];if(mg[i][j]==0)find=1;}if(find==1) //若有路可走则进栈{st[top].di=di;top++;st[top].i=i;st[top].j=j;st[top].di=-1;mg[i][j]=-1;}else//没路走就退栈{mg[st[top].i][st[top].j]=0;top--;}}printf("-----------------------------------------------------\n");printf("最短路径如下:\n");printf("长度:%d\n",minlen);printf("路径:(%d,%d)",Path[0].i,Path[0].j);for(k=1;k<minlen;k++){printf("->(%d,%d)",Path[k].i,Path[k].j);if((k+1)%5==0)printf("\n");}printf("\n");count=1;printf("-----------------------------------------------------\n");}(三)Control.cpp中,实现方向的控制,游戏结束的判断,墙和路的相互转换以及游戏结束后是否继续游戏的选择。
1.方向的控制bool up(int (*mg)[N],int x,int r,int c);bool down(int (*mg)[N],int x,int r,int c);bool right(int (*mg)[N],int x,int r,int c);bool left(int (*mg)[N],int x,int r,int c) {if(c<3||mg[r][c-1]==1) //判断能否移动,不能反悔falsereturn false;mg[r][c]=0; //能移动,将当前位置置0;移动的目标位置置6.返回truec--;mg[r][c]=6;return true;}bool down()流程图如下: bool PDfinish()流程图如下:四个方向控制的函数思想一样,不重复结束了。
2. bool PDfinish(int (*mg)[N],int x,int r,int c)判断游戏是否结束,即判断出口位置的值是否等于6,等于则返回true。
3. void row_wall(int (*mg)[N])流程图右边:;void row_way(int(*mg)[N]);void col_wall(int(*mg)[N]);void col_way(int (*mg)[N]);算法就是改变选定的位置区间的值。
4. bool PDpaly()用于判断是否继续游戏。
(四)Play.cpp中,实现游戏的过程,以及说明的输出。
1.int Play(int (*mg)[N],int x,int r,int c)实现游戏的操作,就是将control.cpp中函数功能实现。
2. void Explain()输出游戏的说明。
(五)lzq2012131247.cpp是主函数,用于实现迷宫函数的所有功能。
四.测试数据与测试结果1.迷宫的创建测试,输入8,输出的是17*17的迷宫,详情看算法。
2.迷宫自动寻路功能的测试3.方向移动的测试4.游戏判断的测试5.存储测试6.墙路转换的测试五.课程设计总结与体会由于以前的知识学习的不算扎实,所以该课程设计对于我来说还是很有难度的。
在编写程序的时候,经常要去看教科书,或者请教百度和老师。
发现自己对图的遍历方法没有掌握,对程序的组织不够熟练。
对了实验过程中的bug,要花很长的时间去调试,可以说,修改bug 的时间占了大部分,远远多于写代码的时间。