迷宫问题课程设计

时间:2022-11-22 15:33:33 电子信息工程毕业论文 我要投稿
  • 相关推荐

迷宫问题课程设计

目 录 1问题描述………………………………………………………………...1 2需求分析 1 3概要设计 1 3.1抽象数据类型定义 1 3.2子程序及功能要求 1 3.3各程序模块之间的调用关系 2 4详细设计 2 4.1设计相应数据结构 2 4.2主要模块的算法描述 3 5测试分析 9 6课程设计总结 10 参考文献 10 附录(源程序清单) 10 1 问题描述 编制程序给出一条通过迷宫的路径或报告一个“无法通过”的信息。该迷宫是一个M行N列的0-1矩阵,其中0表示无障碍,1表示有障碍。设入口为(1,1)出口为(M,N)每次移动只能从一个无障碍的单元移到其周围8个方向上任一无障碍的单元, 2 需求分析 该算法的基本思想是: (1) 若当前位置“可通”,则纳入路径,继续前进; (2)若当前位置“不可通”,则后退,换方向继续探索; (3)若四周“均无通路”,则将当前位置从路径中删除出去。 3 概要设计 3.1 抽象数据类型定义 typedef struct { int x, y; //坐标 int dir; //方向 }ElemType; typedef struct StackNode//构造栈 { ElemType *base; ElemType *top; int stacksize; }SqStack; 3.2 子程序及功能要求 (1)void Input(char b[M][M]); (2)void Ouput(const char b[M][M]); (3)int FindWay(char maze[M][M]); (4)int NextStep(int *x, int *y, int dir). 3.3 各程序模块之间的调用关系 主函数可调用子程序void Input(char b[M][M]); void Ouput(const char b[M][M]); int FindWay(char maze[M][M]); int NextStep(int *x, int *y, int dir). 4 详细设计 4.1 设计相应数据结构 (1)迷宫类型定义 typedef struct { int x, y; //坐标 int dir; //方向 }ElemType; typedef struct StackNode//构造栈 { ElemType *base; ElemType *top; int stacksize; }SqStack; (2)栈元素类型定义 int InitStack(SqStack *S) //初始化栈 { S->base=(ElemType*) malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!S->base) { printf("memory allocation failed,goodbye"); exit(1); } S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK; } 4.2 主要模块的算法描述 #include #include #define M 10 //自己规定为10*10的迷宫 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 int findway(int); int NextStep(int *, int *, int ); typedef struct { int x, y; //坐标 int dir; //方向 }ElemType; typedef struct StackNode//构造栈 { ElemType *base; ElemType *top; int stacksize; }SqStack; int InitStack(SqStack *S) //初始化栈 { S->base=(ElemType*) malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!S->base) { printf("memory allocation failed,goodbye"); exit(1); } S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK; } int Push(SqStack *S,ElemType e) //进栈操作 { if(S->top-S->base>=S->stacksize) { S->base=(ElemType*) realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(Eleme)); if (!S->base) { printf("memory allocation failed,goodbye"); exit(1); } S->top = S->base+S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++=e; return OK; } int Pop(SqStack *S,ElemType *e) //出栈操作 { if(S->top==S->base) { return ERROR; } *e=*--S->top; printf("%d\n",e); return OK; } int StackEmpty(SqStack *S) //判断栈是否为空 { if(S->top==S->base) return OK; else return ERROR; } void Input(char b[M][M]) //输入时候请注意把一圈都输入为墙即'#' { int i, j; printf("qingshuirumigongxingzhuang:\n"); for (i = 0; i < M; i++) { for (j = 0; j < M; j++) { scanf("%c",&b[i][j]); } getchar();//吃掉内存中的残留换行符号 } } void Ouput(const char b[M][M]) { int i, j; printf("migongxingzhuangwei:\n"); for (i = 0; i < M; i++) { for (j = 0; j < M; j++) { printf("%c",b[i][j]); } printf("\n"); } } int FindWay(char maze[M][M]) { ElemType e; int constep = 1; int x = 1, y = 1; SqStack S; InitStack(&S); do { if (maze[x][y] == ' ') //当第3次时 maze[x][y]!=' ' 照样通不过 { maze[x][y] = '1'; e.x = x; e.y = y; e.dir = 1; Push(&S,e); if (x == M-2 && y == M-2) { printf("cunzaichukou\n"); return 1; } NextStep(&x,&y,1); constep++; } else { Pop(&S,&e); while (e.dir == 4 && !StackEmpty(&S)) { maze[e.x][e.y] = '0'; Pop(&S,&e); } { if (e.dir < 4) { e.dir++; Push(&S,e); x = e.x; y = e.y; NextStep(&x, &y, e.dir); } else { printf("meiyouchukou\n"); return 0; } } } }while(S.top!=S.base); return 0; } int NextStep(int *x, int *y, int dir) { switch(dir) { case 1: (*y)++; break; case 2: (*x)++; break; case 3: (*y)--; break; case 4: (*x)--; break; default: break; } return 0; } int main(void) { char a[M][M]; Input(a); Ouput(a); FindWay(a); Ouput(a); system("pause"); return 0; } 5 测试分析 6 课程设计总结 该次程序设计我作为组长,我先写了任务书,再把模板及其要求告诉了组员,再跟他们一起编写程序、查找资料来修改程序,再一起测试分析,最后以总结结束 通过这次课程设计,我深刻的体会到了数据结构的重要性。学数据结构不只是为了考试,更重要的是它对我们以后也会有很大的帮助,尤其是我们这个注专业。在整个课程设计过程中,我遇到了许多困难,不管是编程序改还是调试等都存在很多问题。一遇到问题我就查看各种资料来解决,但还是又很多不明白的地方,特别是运行的时候我还问了同学。由此我意识到自己有许多要学的,学的也不够认真不够透彻。 参考文献: [1] 严蔚敏,吴伟民. 数据结构(C语言版)[M]. 北京:清华大学出版社,2002 [2] 刘振鹏,张晓莉,郝杰.数据结构[M].北京:中国铁道出版社,2003 [3] 李春葆.数据结构习题与解析(C语言篇)[M].北京:清华大学出版社,2000 附录(源程序清单) #include #include #define M 10 //自己规定为10*10的迷宫 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 int findway(int); int NextStep(int *, int *, int ); typedef struct { int x, y; //坐标 int dir; //方向 }ElemType; typedef struct StackNode//构造栈 { ElemType *base; ElemType *top; int stacksize; }SqStack; int InitStack(SqStack *S) //初始化栈 { S->base=(ElemType*) malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!S->base) { printf("memory allocation failed,goodbye"); exit(1); } S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK; } int Push(SqStack *S,ElemType e) //进栈操作 { if(S->top-S->base>=S->stacksize) { S->base=(ElemType*) realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(Eleme)); if (!S->base) { printf("memory allocation failed,goodbye"); exit(1); } S->top = S->base+S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++=e; return OK; } int Pop(SqStack *S,ElemType *e) //出栈操作 { if(S->top==S->base) { return ERROR; } *e=*--S->top; printf("%d\n",e); return OK; } int StackEmpty(SqStack *S) //判断栈是否为空 { if(S->top==S->base) return OK; else return ERROR; } void Input(char b[M][M]) //输入时候请注意把一圈都输入为墙即'#' { int i, j; printf("qingshuirumigongxingzhuang:\n"); for (i = 0; i < M; i++) { for (j = 0; j < M; j++) { scanf("%c",&b[i][j]); } getchar();//吃掉内存中的残留换行符号 } } void Ouput(const char b[M][M]) { int i, j; printf("migongxingzhuangwei:\n"); for (i = 0; i < M; i++) { for (j = 0; j < M; j++) { printf("%c",b[i][j]); } printf("\n"); } } int FindWay(char maze[M][M]) { ElemType e; int constep = 1; int x = 1, y = 1; SqStack S; InitStack(&S); do { if (maze[x][y] == ' ') //当第3次时 maze[x][y]!=' ' 照样通不过 { maze[x][y] = '1'; e.x = x; e.y = y; e.dir = 1; Push(&S,e); if (x == M-2 && y == M-2) { printf("cunzaichukou\n"); return 1; } NextStep(&x,&y,1); constep++; } else { Pop(&S,&e); while (e.dir == 4 && !StackEmpty(&S)) { maze[e.x][e.y] = '0'; Pop(&S,&e); } { if (e.dir < 4) { e.dir++; Push(&S,e); x = e.x; y = e.y; NextStep(&x, &y, e.dir); } else { printf("meiyouchukou\n"); return 0; } } } }while(S.top!=S.base); return 0; } int NextStep(int *x, int *y, int dir) { switch(dir) { case 1: (*y)++; break; case 2: (*x)++; break; case 3: (*y)--; break; case 4: (*x)--; break; default: break; } return 0; } int main(void) { char a[M][M]; Input(a); Ouput(a); FindWay(a); Ouput(a); system("pause"); return 0; }

【迷宫问题课程设计】相关文章:

课程设计报告07-20

方法、思路与问题06-01

论文答辩问题01-17

休谟问题与先验范畴05-06

施工组织设计课程设计开题报告07-13

论文答辩问题与答案04-27

论文答辩的问题及答案04-06

答辩时要注意的问题04-14

让学生善于质疑问题06-11

物体平衡问题的求解方法05-13