曾经用C语言做过的动态走迷宫程序,先分享代码如下:

代码如下:

  1. //头文件
  2. #include<stdio.h>
  3. #include<windows.h>//Sleep(500)函数调用此头文件
  4. #include<conio.h>//getch()函数调用此头文件
  5. #include<stdlib.h>//system("cls")函数调用此头文件
  6.  
  7. //函数状态码定义
  8. /******************************/
  9. #define TRUE 1
  10. #define FALSE 0
  11. #define OK 1
  12. #define ERROR 0
  13. #define INFEASIBLE -1
  14. #define OVERFLOW -2
  15. typedef int Status;
  16. #define STACK_INIT_SIZE 100
  17. #define STACKINCREMENT 10
  18. #define Pass 0 //可通过
  19. #define Wall 1 //墙
  20. #define Start 6 //起点
  21. #define End 7 //终点
  22. #define Back 8 //返回
  23. #define Exit 9 //出口:找到终点后标志出来
  24. /******************************/
  25.  
  26. //自定义数据类型
  27. /***************************************************/
  28.  
  29. //自定义枚举类型
  30. enum direction{East=,South,West,North};//2,3,4,5分别代表东、南、西、北
  31. /*+------------------------
  32. 使用枚举类型来表示方向
  33. 该枚举类型定义的变量只能取值 East,West,South,North
  34. 且East=2,South=3,West=4,North=5
  35. 本源码上面使用枚举类型,基本等效于下面
  36. #define East 2
  37. #define South 3
  38. #define West 4
  39. #define North 5
  40. +------------------------*/
  41.  
  42. //自定义坐标结构体
  43. typedef struct //迷宫x行,y列
  44. {
  45. int x;
  46. int y;
  47. }Position;//坐标结构体
  48.  
  49. //二维数组构造迷宫,1代表墙,0代表可通过。
  50. int Map[][]={
  51. {,,,,,,,,,},
  52. {,,,,,,,,,},
  53. {,,,,,,,,,},
  54. {,,,,,,,,,},
  55. {,,,,,,,,,},
  56. {,,,,,,,,,},
  57. {,,,,,,,,,},
  58. {,,,,,,,,,},
  59. {,,,,,,,,,},
  60. {,,,,,,,,,}
  61. };
  62.  
  63. //自定义结构体作为中间变量保存当前临时坐标信息
  64. typedef struct
  65. {
  66. int number;//记录是第几步
  67. Position seat;//通道块在迷宫中的"位置坐标"
  68. enum direction direc;
  69. //direction为枚举类型,用来表示从此通道走向下一通道的方向
  70. //direc只能取值 East,West,South,North
  71. //且East=2,South=3,West=4,North=5
  72. }SElemType;
  73.  
  74. //自定义栈结构便于将上面结构体的临时坐标信息放到栈内存储
  75. typedef struct {
  76. SElemType *base;
  77. SElemType *top;
  78. int stacksize;
  79. }SqStack;//栈
  80. /*********************************************/
  81.  
  82. //函数声明
  83. /******************************************/
  84.  
  85. void Welcome();//欢迎界面函数
  86. void printfMap();//打印迷宫函数
  87. Status findPath(SqStack &S,Position start,Position end);//迷宫寻路径函数
  88. Status InitStack(SqStack &S);//初始化栈
  89. Status StackEmpty(SqStack S);//判断栈是否为空
  90. Status Push(SqStack &S,SElemType e);//入栈
  91. Status Pop(SqStack &S,SElemType &e);//出栈
  92. enum direction Judge_direc(Position pos);//根据一个坐标探索周围坐标返回可通行的坐标
  93. Position change_seat(Position &pos,enum direction direc);//根据方向移动到下一个可通行的坐标处
  94. Status change_Map(int mapid);
  95.  
  96. /****************主函数开始***********************/
  97.  
  98. //主函数
  99. int main()
  100. {
  101. Position start,end;
  102. int n;
  103. SqStack S;
  104. InitStack(S);//初始化栈
  105. Welcome();//调用欢迎界面函数
  106. start.x=;//
  107. start.y=;//
  108. printf("请选择地图:\n\n");
  109. change_Map();
  110. printf("\t\t默认地图0\n\n");
  111. printfMap();
  112. change_Map();
  113. printf("\t\t备选地图1\n\n");
  114. printfMap();
  115. printf("选择默认地图请输入0,备选地图请输入1:\n");
  116. printf("您的选择:");
  117. scanf("%d",&n);
  118. system("cls");
  119. switch(n)
  120. {
  121. case :
  122. {
  123. change_Map();printf("初始迷宫如下所示:\n\n");
  124. end.x=;end.y=;
  125. printfMap();
  126. printf("按任意键继续!");
  127. getch();
  128. system("cls");
  129. break;
  130. }
  131. case :
  132. {
  133. change_Map();printf("初始迷宫如下所示:\n\n");
  134. end.x=;
  135. end.y=;
  136. printfMap();
  137. printf("按任意键继续!");
  138. getch();
  139. system("cls");
  140. break;
  141. }
  142. }
  143. findPath(S,start,end);
  144. printf("\n\n按下任意键退出系统!\n");
  145. getch();
  146.  
  147. return ;
  148. }
  149. /***************主函数结束***********************/
  150. //打印迷宫
  151. void printfMap()
  152. {
  153. int i,j;
  154. for(i=;i<;i++)
  155. {
  156. printf("\t");
  157. for(j=;j<;j++)
  158. switch(Map[i][j]){
  159. case Pass:printf("□");break;//可通过0
  160. case Wall:printf("■");break;//墙1
  161. case East:printf("→");break;//东2
  162. case South:printf("↓"); break;//南3
  163. case West:printf("←");break;//西4
  164. case North:printf("↑");break;//北5
  165. case Start:printf("⊙");break;//起点6
  166. case End:printf("◎");break;//终点7
  167. case Back:printf("Θ");break;//返回8
  168. case Exit:printf("To");break;//出口9
  169. }
  170. printf("\n");
  171. }
  172. printf("\n");
  173. }
  174.  
  175. //走迷宫
  176. Status findPath(SqStack &S,Position start,Position end){
  177. Position curpos;//当前坐标
  178. SElemType elem;//路径相关信息结构体
  179. int step=;//记录步骤数
  180. curpos=start;//开始坐标
  181. while(){
  182. if(curpos.x==start.x&&curpos.y==start.y)//此段代码只执行一次
  183. {
  184. elem.number=;
  185. elem.direc=Judge_direc(curpos);//判断下一个位置是什么方向
  186. elem.seat=curpos;
  187. step++;
  188. Push(S,elem);//第一个起点无条件入栈
  189. }
  190.  
  191. Map[curpos.x][curpos.y]=(int)elem.direc;//锁定当前位置
  192. curpos=change_seat(curpos,elem.direc);//移动到下一个位置,根据方向改变坐标位置
  193. if(Map[curpos.x][curpos.y]==End)//找到终点,退出循环
  194. {
  195. elem.seat=curpos;
  196. elem.number=step;
  197. Push(S,elem);
  198. Map[curpos.x][curpos.y]=Exit;
  199. system("cls");
  200. printf("\n");
  201. printfMap();
  202. printf("\n\t恭喜您,迷宫路径已经找到!\n\n");
  203. printf("路径坐标为:\n\n");
  204. while(!StackEmpty(S))
  205. {
  206. Pop(S,elem);//出栈
  207. curpos=elem.seat;
  208. printf("(%d,%d)\t",curpos.x,curpos.y);
  209. }
  210. break;
  211. }
  212. if(Map[curpos.x][curpos.y]==Pass)//如果当前路可通
  213. {
  214. elem.number=step;
  215. elem.seat=curpos;
  216. elem.direc=Judge_direc(curpos);
  217. Push(S,elem);//将当前坐标入栈
  218. step++;
  219. }
  220. else//如果当前位置不通
  221. {
  222. Pop(S,elem);
  223. curpos=elem.seat;
  224. step=elem.number-;
  225. Map[curpos.x][curpos.y]=Back;//表示四个都不通,标记走过了
  226. do
  227. {
  228. Pop(S,elem);//出栈
  229. curpos=elem.seat;
  230. /************while循环开始*****************/
  231. while(elem.direc<=)
  232. {
  233. elem.direc=(enum direction)(elem.direc+);
  234. curpos=change_seat(curpos,elem.direc);//移动到下一个位置,根据方向改变坐标位置
  235. if(Map[curpos.x][curpos.y]==Pass)
  236. {
  237. break;
  238. }
  239. };
  240. /************while循环结束*****************/
  241. if(Map[curpos.x][curpos.y]==Pass)
  242. {
  243. curpos=elem.seat;
  244. elem.number=step;
  245. elem.seat=curpos;
  246. Push(S,elem);
  247. step++;
  248. break;
  249. }
  250. else
  251. {
  252. curpos=elem.seat;
  253. Map[curpos.x][curpos.y]=Back;
  254. }
  255. printf("正在遍历查找...\n\n");
  256. printfMap();
  257. Sleep();
  258. system("cls");
  259. }while(!StackEmpty(S));//直到栈为空跳出循环
  260. }
  261. printf("正在遍历查找...\n\n");
  262. printfMap();
  263. Sleep();
  264. system("cls");
  265. }
  266. return OK;
  267. }
  268.  
  269. //改变坐标
  270. Position change_seat(Position &pos,enum direction direc){
  271. switch(direc)
  272. {
  273. case East: pos.y=pos.y+;break;//
  274. case South: pos.x=pos.x+;break;//
  275. case West: pos.y=pos.y-;break;//
  276. case North: pos.x=pos.x-;break;//
  277. }
  278. return pos;
  279. }
  280. //判断下一个位置方向
  281. enum direction Judge_direc(Position pos)
  282. {
  283. enum direction judge;
  284. if(Map[pos.x][pos.y+]==Pass||Map[pos.x][pos.y+]==End)
  285. judge=East;
  286. else
  287. {
  288. if(Map[pos.x+][pos.y]==Pass||Map[pos.x+][pos.y]==End)
  289. judge=South;
  290. else
  291. {
  292. if(Map[pos.x][pos.y-]==Pass||Map[pos.x][pos.y-]==End)
  293. judge=West;
  294. else
  295. {
  296. if(Map[pos.x-][pos.y]==Pass||Map[pos.x-][pos.y]==End)
  297. judge=North;
  298. }
  299. }
  300. }
  301. return judge;
  302. }
  303.  
  304. Status change_Map(int mapid)
  305. {
  306. if(mapid==)//默认地图
  307. {
  308. Map[][]=Wall;
  309. Map[][]=End;
  310. }
  311. if(mapid==)//其他地图
  312. {
  313. Map[][]=Wall;
  314. Map[][]=End;
  315. }
  316. return OK;
  317. }
  318.  
  319. //初始化栈
  320. Status InitStack(SqStack &S){
  321. S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
  322. if(!S.base)exit(OVERFLOW);
  323. S.top=S.base;
  324. S.stacksize=STACK_INIT_SIZE;
  325. return OK;
  326. }
  327.  
  328. //判断栈是否为空
  329. Status StackEmpty(SqStack S){
  330. if(S.top==S.base)
  331. return TRUE;
  332. else
  333. return FALSE;
  334. }
  335. //入栈
  336. Status Push(SqStack &S,SElemType e){
  337. if(S.top-S.base>=S.stacksize){
  338. S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
  339. if(!S.base)exit(OVERFLOW);
  340. S.top=S.base+S.stacksize;
  341. S.base+=STACKINCREMENT;
  342. }
  343. *S.top++=e;
  344. return OK;
  345. }
  346.  
  347. //出栈
  348. Status Pop(SqStack &S,SElemType &e){
  349. if(S.top==S.base)return ERROR;
  350. e=*--S.top;
  351. return OK;
  352. }
  353. //去栈顶元素
  354. Status GetTop(SqStack S,SElemType &e){
  355.  
  356. if(S.top==S.base)return ERROR;
  357.  
  358. e=*(S.top-); //注意top指向待插入位置
  359.  
  360. return OK;
  361.  
  362. }
  363.  
  364. //欢迎界面函数
  365. void Welcome(){
  366. system("title 迷宫求解程序");//设置窗口标题
  367. system("mode con cols=80 lines=40"); //窗口宽度高度
  368. system("color a");//设置文本颜色,所在头文件
  369. printf("★**************************************************************★\n");
  370. printf("★ ★\n");
  371. printf("★ 欢迎使用迷宫求解程序 ★\n");
  372. printf("★ ★\n");
  373. printf("★ 文件名称:数据结构期末实验 ★\n");
  374. printf("★ ★\n");
  375. printf("★ 项目名称:迷宫求解程序 ★\n");
  376. printf("★ ★\n");
  377. printf("★ 创建时间:2014-11-28 ★\n");
  378. printf("★ ★\n");
  379. printf("★ 最后修改时间:2014-12-2 ★\n");
  380. printf("★ ★\n");
  381. printf("★**************************************************************★\n");
  382. printf("按任意键继续!\n");
  383. getch();//暂停函数,所在头文件<conio.h>
  384. system("cls");//清屏函数
  385. }

C语言动态走迷宫的更多相关文章

  1. C语言之走迷宫深度和广度优先(利用堆栈和队列)

    完成以下迷宫 利用二维数组储存每一个数组里的值,若是不能走则为1,若是可行就是0,走过了就设为2. 一般是再复制一个数组,用来记录. 堆栈的思想就是将一个点的上下左右都遍历一遍,若可行进栈,跳出遍历, ...

  2. 百炼3752:走迷宫--栈实现dfs

    3752:走迷宫 总时间限制:  1000ms 内存限制:  65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最 ...

  3. sdut 2449走迷宫【最简单的dfs应用】

    走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_ 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m) ...

  4. Rmarkdown用法与R语言动态报告

    Rmarkdown用法与R语言动态报告数据分析用R语言非常便捷,因为R语言的社区强大,并且在不断更新和完善,提供了各种分析利器.Knitr和Rmarkdown包则是数据分析中的动态报告利器. 下面是一 ...

  5. 洛谷P1238 走迷宫

    洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...

  6. BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )

    数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...

  7. NYOJ306 走迷宫(dfs+二分搜索)

    题目描写叙述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩.它经常偷偷跑出实验室,在某个游乐场玩之不 ...

  8. Problem A: 走迷宫问题

    Problem A: 走迷宫问题Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 9 Solved: 3[Submit][Status][Web Board] ...

  9. BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]

    2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...

随机推荐

  1. expect用法

    1. [#!/usr/bin/expect]  这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西.  注意: ...

  2. 虾扯蛋:Android View动画 Animation不完全解析

    本文结合一些周知的概念和源码片段,对View动画的工作原理进行挖掘和分析.以下不是对源码一丝不苟的分析过程,只是以搞清楚Animation的执行过程.如何被周期性调用为目标粗略分析下相关方法的执行细节 ...

  3. .NET Core 系列5 :使用 Nuget打包类库

    NuGet是个开源项目,项目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等项目,.NET Core项目完全使用Nuget 管理组件之间的依赖关系, ...

  4. Linux下服务器端开发流程及相关工具介绍(C++)

    去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...

  5. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  6. Consul 服务注册与服务发现

    上一篇:Mac OS.Ubuntu 安装及使用 Consul 1. 服务注册 对 Consul 进行服务注册之前,需要先部署一个服务站点,我们可以使用 ASP.NET Core 创建 Web 应用程序 ...

  7. 【NLP】前戏:一起走进条件随机场(一)

    前戏:一起走进条件随机场 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有 ...

  8. 基于window7+caffe实现图像艺术风格转换style-transfer

    这个是在去年微博里面非常流行的,在git_hub上的代码是https://github.com/fzliu/style-transfer 比如这是梵高的画 这是你自己的照片 然后你想生成这样 怎么实现 ...

  9. 登录(ajax提交数据和后台校验)

    1.前台ajax数据提交 <form id="login_form" action="" method="POST"> < ...

  10. Android事件分发机制浅谈(一)

    ---恢复内容开始--- 一.是什么 我们首先要了解什么是事件分发,通俗的讲就是,当一个触摸事件发生的时候,从一个窗口到一个视图,再到一个视图,直至被消费的过程. 二.做什么 在深入学习android ...