顺序栈和迷宫求解(C语言)
顺序栈
根据《数据结构》书中的讲解,对顺序栈的一个基本实现。
define.h
1 // define.h 2 #ifndef __MENGQL_DEFINE__ 3 #define __MENGQL_DEFINE__ 4 5 #define C_LOG_DBG(format, ...) 6 //printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); 7 #define C_LOG_ERR(format, ...) printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); 8 typedef enum EStatus {ERROR, OK} Status; 9 10 #endif
SqStack.h
1 // SqStack.h 2 #ifndef __SQ_STACK_H__ 3 #define __SQ_STACK_H__ 4 #include "define.h" 5 6 typedef struct 7 { 8 int x; 9 int y; 10 }PosType; 11 12 typedef struct 13 { 14 int ord; 15 PosType seat; 16 int di; 17 }SElemType; 18 19 #define STACK_INIT_SIZE 100 20 typedef struct 21 { 22 SElemType* base; 23 SElemType* top; 24 int stacksize; 25 }SqStack; 26 27 extern Status InitStack(SqStack *S); 28 extern Status GetTopStack(SqStack S, SElemType *e); 29 extern Status PushStack(SqStack *S, SElemType e); 30 extern Status PopStack(SqStack *S, SElemType *e); 31 extern Status StackEmpty(SqStack *S); 32 extern Status DestoryStack(SqStack *S); 33 #endif
SqStack.c
1 // SqStack.c 2 #include "define.h" 3 #include "SqStack.h" 4 #include <stdlib.h> 5 #include <stdio.h> 6 Status InitStack(SqStack *S) 7 { 8 S->stacksize = STACK_INIT_SIZE; 9 S->base = (SElemType *)malloc(S->stacksize * sizeof(SElemType)); 10 if(S->base == NULL) 11 { 12 C_LOG_ERR("%s\n","MALLOC OVERFLOW!!!"); 13 return ERROR; 14 } 15 S->top = S->base; 16 17 return OK; 18 } 19 Status GetTopStack(SqStack S, SElemType *e) 20 { 21 if(S.top == S.base) 22 { 23 C_LOG_ERR("%s\n","STACK IS EMPTY!!!"); 24 return ERROR; 25 } 26 *e = *(S.top-1); 27 return OK; 28 } 29 Status PushStack(SqStack *S, SElemType e) 30 { 31 if(S->top - S->base >= S->stacksize) 32 { 33 S->base = (SElemType *)realloc(S->base, (S->stacksize * 2) * sizeof(SElemType)); 34 if(S->base == NULL) 35 { 36 C_LOG_ERR("%s\n","REMALLOC OVERFLOW!!!"); 37 return ERROR; 38 } 39 S->stacksize *= 2; 40 } 41 *(S->top++) = e; 42 return OK; 43 } 44 Status PopStack(SqStack *S, SElemType *e) 45 { 46 if(S->top == S->base) 47 { 48 C_LOG_ERR("%s\n","STACK IS EMPTY!!!"); 49 return ERROR; 50 } 51 *e = *(--S->top); 52 return OK; 53 } 54 Status StackEmpty(SqStack *S) 55 { 56 if(S->top == S->base) 57 { 58 return OK; 59 } 60 return ERROR; 61 } 62 Status DestoryStack(SqStack *S) 63 { 64 S->stacksize = 0; 65 free(S->base); 66 S->top = S->base = NULL; 67 return OK; 68 }
迷宫求解
顺序栈实现的迷宫求解是深度优先搜索,得出的路径是非最短路径。
测试用例 1 8 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0
Maze.c
//Maze.c #include <string.h> #include <stdio.h> #include <stdlib.h> #include "define.h" #include "SqStack.h"int **g_MazeMap; int g_m, g_n;//g_m:列数 g_n:行数#define FAILEDPOS 5 #define FOOTPRINT 2void MazePrint() {int i, j;for(i=0; i<g_m; ++i){for(j=0; j<g_n; ++j){printf("%d ", g_MazeMap[i][j]);}printf("\n");} }void MazePrintRes(SqStack *S) {SElemType e;if(StackEmpty(S) == OK){return;}else{PopStack(S, &e);MazePrintRes(S);printf("[%d][%d, %d]\n", e.ord, e.seat.x, e.seat.y);} }Status MazePass(PosType pos) {if(pos.x>=0 && pos.y>=0 && pos.x<g_m && pos.y<g_n && g_MazeMap[pos.y][pos.x] == 0){return OK;}return ERROR; } void MazeFootPrint(PosType pos) {g_MazeMap[pos.y][pos.x] = FOOTPRINT; } void MarkPrint(PosType pos) {g_MazeMap[pos.y][pos.x] = FAILEDPOS; } void NextPos(PosType *pos, int di) {switch(di){case 1:pos->y = pos->y-1;break;case 2:pos->x = pos->x-1;break;case 3:pos->y = pos->y+1;break;case 4:pos->x = pos->x+1;break;defult:break;} } /* DFS, use stack, is not shortest path */ Status MazePath(PosType *start, PosType *end) {SqStack S;int nCurStep = 1;PosType curPos;SElemType e;curPos.x = start->x;curPos.y = start->y;if(InitStack(&S) != OK){return ERROR;}do{if(MazePass(curPos) == OK){MazeFootPrint(curPos);e.ord = nCurStep;e.di = 1;e.seat.x = curPos.x;e.seat.y = curPos.y;PushStack(&S, e);if(curPos.x == end->x && curPos.y == end->y){MazePrintRes(&S);MazePrint();return OK;}NextPos(&curPos, e.di);nCurStep++;}else{if(StackEmpty(&S) != OK){PopStack(&S, &e);C_LOG_DBG("[%d][%d][%d]\n", e.seat.x, e.seat.y, e.di);while(e.di>=4 && StackEmpty(&S)!=OK){MarkPrint(e.seat);PopStack(&S, &e);}C_LOG_DBG("[%d][%d][%d]\n", e.seat.x, e.seat.y, e.di);if(e.di < 4){e.di++;PushStack(&S, e);NextPos(&e.seat, e.di);curPos.x = e.seat.x;curPos.y = e.seat.y;}}}}while(StackEmpty(&S) != OK);DestoryStack(&S);return ERROR; } /* 如果要输出最短路径,还需要进一步处理 */ int main() {PosType start;PosType end;int i, j;scanf("%d %d", &g_m, &g_n);start.x = 0;start.y = 0;end.x = g_m-1;end.y = g_n-1;g_MazeMap=(int**)malloc(g_m*sizeof(int*));for(i=0; i<g_m; ++i){g_MazeMap[i] = (int*)malloc(g_n*sizeof(int));}for(i=0; i<g_m; ++i){for(j=0; j<g_n; ++j){scanf("%d", &g_MazeMap[i][j]);}}MazePath(&start, &end);return 0; }
输出结果:
[1][0, 0] [2][0, 1] [3][0, 2] [4][0, 3] [5][0, 4] [8][1, 4] [9][2, 4] [10][2, 5] [11][3, 5] [12][4, 5] [13][4, 4] [14][5, 4] [15][5, 3] [16][6, 3] [17][6, 2] [18][7, 2] [21][7, 3] [22][7, 4] [23][6, 4] [24][6, 5] [25][7, 5] [26][7, 6] [27][7, 7] 2 0 1 0 0 0 1 5 2 0 1 0 0 0 1 5 2 0 0 0 1 1 2 2 2 1 1 1 1 2 2 2 2 2 2 1 2 2 2 2 5 1 2 2 2 1 2 2 5 1 1 1 0 1 1 2 1 0 0 0 0 0 0 2
从结果可以看出,走了很多弯路。如果改用队列实现BFS就可以直接得出最短路径。
转载于:https://www.cnblogs.com/favourmeng/archive/2012/08/22/2650555.html
顺序栈和迷宫求解(C语言)相关推荐
- C语言用栈实现迷宫求解
大学的实训课,要求做一个迷宫,其中墙用1标注,通路用0标注,然后寻找一个从默认起点1,1到默认终点8,8的通路.发现网上有好多类似的其实都用不了,于是乎自己缝缝补补出了一个能用的,注解写的比较全,可以 ...
- java使用链栈实现迷宫求解
java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...
- 【数据结构】顺序栈的实现(C语言)
栈的基本概念及其描述 栈是一种特殊的线性表,规定它的插入运算和删除运算均在线性表的同一端进行,进行插入操作和删除操作的那一端称为栈顶,另一端称为栈底. 栈的插入操作和删除操作分别称为进栈和出栈. FI ...
- 顺序栈十进制转八进制C语言,顺序栈实现十进制跟八进制之间的转换
顺序栈实现十进制和八进制之间的转换 顺序栈实现十进制和八进制之间的转换 (1)首先实现栈的初始化,既申请固定大小的数组空间,存储数据,用到的方法是 int InitStack( struct sq ...
- 二维数组迷宫求解c语言,c语言写的迷宫问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 下面是程序 #include #define OVERFLOW -2 #define ERROR 0 #define NULL 0 #define tru ...
- C语言 迷宫问题求解(顺序栈应用示例)
[cpp] view plaincopy //顺序栈的应用:迷宫 //作者:nuaazdh //时间:2011年12月7日 #include <stdio.h> #include < ...
- 数据结构《顺序栈》知识点详解+C语言完整代码-超详细
顺序栈 栈 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式 C语言代码实现 1. 顺序栈的表示 2. 结构体 3.初始化 4.入栈 5.出栈 6. 取栈顶元素 7.求长 8 ...
- c语言迷宫游戏怎么存放坐标,求解迷宫问题(c语言,很详细哦
<求解迷宫问题(c语言,很详细哦>由会员分享,可在线阅读,更多相关<求解迷宫问题(c语言,很详细哦(5页珍藏版)>请在人人文库网上搜索. 1.求迷宫问题就是求出从入口到出口的路 ...
- c语言迷宫问题输出坐标,C语言数据结构之迷宫求解问题
现在网上各种对于迷宫的求解,版本多的数不胜数.本人小白一枚,贴上自己对迷宫的求解这个小项目,自己写的.望能帮助一些同样有困难的人,毕竟我当时费解了好一会儿时间呢. 首先,先标明对于迷宫求解这个项目,首 ...
- 栈和队列求解迷宫问题(数据结构学习笔记)
文章目录 迷宫问题 "栈"求解迷宫问题 行走规则 算法思路 算法代码 栈的定义 算法设计 完整代码 最终迷宫路径 算法总结 "队列"求解迷宫问题 算法思路 算法 ...
最新文章
- Embarcadero公司花2千3百万买下Borland的开发工具业务
- shiro+redis实现session共享
- 一个简单的配置管理器(SettingManager)
- 【人脸识别】初识人脸识别
- 线程同步,线程不同步_重新同步多线程集成测试
- SQL Server 2008:示例数据库安装
- python办公入门经典_Python3入门经典100例
- 泵车砼活塞故障预警-冠军方案
- vb利用计算机 鸡兔同笼,VB程序题:利用计算机解决古代数学瓿“鸡兔同笼问题”。即已知在同一笼子里有总数为m只鸡和兔,鸡和兔的总脚数为n只,求鸡和兔各有多少只? VB源码 龚沛曾...
- NOIP2013华容道
- 一种APP和微信远程组态监控台达PLC的方案
- 自然语言处理入门(4)——中文分词原理及分词工具介绍
- HTML中font标签用法
- 向量正交 与 函数正交
- 问题 - GitLab repositories 文件夹权限异常
- 第八章、使用matplotlib绘制高级图表
- 你觉得程序员最需要具备哪些软技能?
- linux更新网卡驱动版本,Linux中升级网卡驱动
- 《工业控制网络安全技术与实践》一第1章 绪 论
- iOS Facebook第三方登录