纯c语言迷宫源码

举报
C语言与CPP编程 发表于 2021/06/04 01:21:32 2021/06/04
【摘要】 #include <stdio.h>#include <stdlib.h>#include <time.h> // 来自公众号:c语言与cpp编程 /*迷宫的数组*/int maze[100][100]; /*迷宫的行数和列数*/int m=0,n=0;/**对迷宫进行初始化,用随机数产生迷宫*/void InitMaze(){ int i...

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. // 来自公众号:c语言与cpp编程
  5. /*迷宫的数组*/
  6. int maze[100][100];
  7. /*迷宫的行数和列数*/
  8. int m=0,n=0;
  9. /*
  10. *对迷宫进行初始化,用随机数产生迷宫
  11. */
  12. void InitMaze()
  13. {
  14. int i,j,temp;
  15. srand((unsigned)time(NULL));
  16. for(i=1;i<=m;i++)
  17. for(j=1;j<=n;j++)
  18. {
  19. temp=rand()%100;
  20. if(temp>30)
  21. {
  22. maze[i-1][j-1]=0;
  23. }else
  24. {
  25. maze[i-1][j-1]=1;
  26. }
  27. }
  28. maze[0][0]=0;
  29. maze[m-1][n-1]=9;
  30. }
  31. /*
  32. *定义栈和栈的节点
  33. */
  34. typedef struct Node
  35. {
  36. int x;
  37. int y;
  38. struct Node *next;
  39. }Node,*Stack;
  40. /*
  41. *初始化Stack
  42. */
  43. void InitStack(Node *Stack)
  44. {
  45. Stack=(Node *)malloc(sizeof(Node));
  46. if(Stack==NULL)
  47. {
  48. printf("分配空间失败\n");
  49. exit(0);
  50. }else
  51. {
  52. Stack->next=NULL;
  53. }
  54. }
  55. /*
  56. *压栈
  57. */
  58. void push(Node *Stack,int x,int y)
  59. {
  60. Node *temp;
  61. temp=(Node *)malloc(sizeof(Node));
  62. if (!temp)
  63. {
  64. printf("分配内存空间错误");
  65. return;
  66. }
  67. else
  68. {
  69. temp->x=x;
  70. temp->y=y;
  71. temp->next=Stack->next;
  72. Stack->next=temp;
  73. }
  74. }
  75. /*
  76. *出栈
  77. */
  78. void pop(Node *Stack,int *x,int *y)
  79. {
  80. Node *temp;
  81. temp=Stack->next;
  82. if(!temp){
  83. return;
  84. }else{
  85. *x=temp->x;
  86. *y=temp->y;
  87. }
  88. Stack->next=temp->next;
  89. free(temp);
  90. }
  91. /*
  92. *判断栈是否为空
  93. */
  94. int isEmpty(Node *Stasck)
  95. {
  96. return ((Stasck->next)==NULL);
  97. }
  98. /*
  99. *判断从该点时候可以向其他方向移动,并返回移动的方向
  100. */
  101. int pass(int i,int j)
  102. {
  103. /*右方向*/
  104. if(j<n-1&&(maze[i][j+1]==0||maze[i][j+1]==9))
  105. {
  106. return 2;
  107. }
  108. /*下方向*/
  109. if(i<m-1&&(maze[i+1][j]==0||maze[i+1][j]==9))
  110. {
  111. return 3;
  112. }
  113. /*左方向*/
  114. if(j>=1&&(maze[i][j-1]==0||maze[i][j-1]==9))
  115. {
  116. return 4;
  117. }
  118. /*上方向*/
  119. if(i>=1&&(maze[i-1][j]==0||maze[i-1][j]==9))
  120. {
  121. return 5;
  122. }
  123. return -1;
  124. }
  125. /*
  126. *对迷宫进行打印
  127. */
  128. void drawMaze()
  129. {
  130. int i=0,j=0;
  131. for(i=0;i<m;i++){
  132. for(j=0;j<n;j++)
  133. {
  134. if(maze[i][j]==0||maze[i][j]==9||maze[i][j]==-1)
  135. {
  136. printf("a");
  137. }
  138. else if(maze[i][j]==1)
  139. {
  140. printf("b");
  141. }
  142. else if(maze[i][j]==2)
  143. {
  144. printf("D");
  145. }else if(maze[i][j]==3)
  146. {
  147. printf("X");
  148. }else if(maze[i][j]==4)
  149. {
  150. printf("A");
  151. }else if(maze[i][j]==5)
  152. {
  153. printf("W");
  154. }
  155. }
  156. printf("\n");
  157. }
  158. }
  159. /*
  160. *对迷宫进行路径搜索
  161. *数组的数字有以下含义
  162. *0.该点没有被探索过,且可行
  163. *1.该点不可行
  164. *2.该点是可行的,且进行了向东的探索
  165. *3.该点是可行的,且进行了向南的探索
  166. *4.该点是可行的,且进行了向西的探索
  167. *5.该点是可行的,且进行了向北的探索
  168. *6.该点是入口
  169. *9.该点是出口
  170. *-1.该点已经遍历完毕四个方向,不能找到有效的路径,则置为-1
  171. */
  172. void ShowPath()
  173. {
  174. int curx=0,cury=0;
  175. int count=0;
  176. int flag=0;
  177. Node *Stacks=NULL;
  178. InitStack(Stacks);
  179. do{
  180. if(maze[curx][cury]==9)
  181. {
  182. flag=1;
  183. }
  184. switch(pass(curx,cury)){
  185. case 2:
  186. maze[curx][cury]=2;
  187. push(Stacks,curx,cury);
  188. cury++;
  189. break;
  190. case 3:
  191. maze[curx][cury]=3;
  192. push(Stacks,curx,cury);
  193. curx++;
  194. break;
  195. case 4:
  196. maze[curx][cury]=4;
  197. push(Stacks,curx,cury);
  198. cury--;
  199. break;
  200. case 5:
  201. maze[curx][cury]=5;
  202. push(Stacks,curx,cury);
  203. curx--;
  204. break;
  205. case -1:
  206. maze[curx][cury]=-1;
  207. if(!isEmpty(Stacks))
  208. pop(Stacks,&curx,&cury);
  209. break;
  210. }
  211. count++;
  212. }while(!isEmpty(Stacks)&&flag==0);
  213. if(flag==1)
  214. {
  215. printf("The path is :\n");
  216. printf("\n");
  217. drawMaze();
  218. }else
  219. {
  220. printf("\nSorry,you fail\n");
  221. }
  222. }
  223. /*
  224. *主函数
  225. */
  226. int main()
  227. {
  228. loop:
  229. printf("plase input the number of row m(m>0,m<100):");
  230. scanf("%d",&m);
  231. printf("plase input the number of line n(n>0,n<100):");
  232. scanf("%d",&n);
  233. if(m<0||m>100||n<0||n>100){
  234. printf("The number is error,process will exit !\n");
  235. exit(-1);
  236. }
  237. printf("The character is 'a',it is area.\n");
  238. printf("The character is 'b',it is wall.\n");
  239. printf("\n");
  240. InitMaze();
  241. printf("The oid Maze:\n");
  242. printf("\n");
  243. drawMaze();
  244. printf("\n show the path ?(y/n)");
  245. fflush(stdin);
  246. if(toupper(getch())=='Y')
  247. {
  248. printf("\n");
  249. ShowPath();
  250. printf("\n go on play ?(y/n)");
  251. fflush(stdin);
  252. if(toupper(getch())=='Y')
  253. {
  254. goto loop;
  255. }
  256. else
  257. {
  258. exit(1);
  259. }
  260. }
  261. else
  262. {
  263. exit(1);
  264. }
  265. getch();
  266. return 0;
  267. }

文章来源: blog.csdn.net,作者:C语言与CPP编程,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/112106788

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。