栈 求解迷宫
2016-07-01 20:57
363 查看
/* *Copyright (c) 2016, 烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作者:张旺华 *完成日期: 2016 年 7 月 1 日 *版本号:v1.0 *问题描述:编写一个求解迷宫问题 * */ #include <stdio.h> #include <malloc.h> #define MaxSize 100 #define N 4 //列号 #define M 4 //行号 int mg[M+2][N+2]={ //一个迷宫,其四周要加上均为1的外框 {1,1,1,1,1,1}, {1,0,0,0,1,1}, {1,0,1,0,0,1}, {1,0,0,0,1,1}, {1,1,0,0,0,1}, {1,1,1,1,1,1} }; struct { int i,j; int di; }Stack[MaxSize],Path[MaxSize]; //定义栈和存放最短路径的数组 int top=-1; //栈顶指针 int count=1; //路径数计数 int minlen=MaxSize; //最短路径长度 void mgpath(int xi,int yi,int xe,int ye) //求解迷宫 { int i,j,di,find,k; top++; //进栈 Stack[top].i=xi; Stack[top].j=yi; Stack[top].di=-1; mg[xi][yi]=-1;//初始方块进栈 while(top>-1) { i=Stack[top].i; j=Stack[top].j; di=Stack[top].di; if(i==xe&&j==xe) //找到出口,输出路径 { printf("%4d: ",count++); for(k=0;k<=top;k++) { printf("(%d,%d) ",Stack[k].i,Stack[k].j); if((k+1)%5==0) printf("\n"); } printf("\n"); if(top+1<minlen) { for(k=0;k<=top;k++) Path[k]=Stack[k]; minlen=top+1; } mg[Stack[top].i][Stack[top].j]=0; //让该路径变成其他路径可走方块 top--; i=Stack[top].i; j=Stack[top].j; di=Stack[top].di; } find=0; while(di<4&&find==0) { di++; switch(di) { case 0: i=Stack[top].i-1; j=Stack[top].j; break; case 1: i=Stack[top].i; j=Stack[top].j+1; break; case 2: i=Stack[top].i+1; j=Stack[top].j; break; case 3: i=Stack[top].i,j=Stack[top].j-1; break; } if(mg[i][j]==0) find=1; } if(find==1) //找到下一个可走方块 { Stack[top].di=di; top++; Stack[top].i=i; Stack[top].j=j; Stack[top].di=-1;//下一个可走方块进栈 mg[i][j]=-1; //避免重复走该方块 } else { mg[Stack[top].i][Stack[top].j]=0; //让该位置变其他路径可走方块 top--; } } printf("最短路径如下:\n"); printf("长度: %d\n",minlen); for(k=0;k<minlen;k++) { printf("(%d,%d) ",Path[k].i,Path[k].j); if ((k+1)%5==0) printf("\n\t"); //输出时每5个方块换一行 } printf("\n"); } int main() { printf("迷宫所有路径如下:\n"); mgpath(1,1,M,N); return 0; }
运行结果:
学习心得:
基本思路:根据起点和终点,di设为前进的方向,在每一个位置上有四个方位,上左下右。di值分别为0、1、2、3.走过的点在mg数组标记为-1,为走过为0,墙为1.下一个点状态为0是为可行路线。当各个方位都不可行,出栈,top--,退到下一个方块,选择另一个方位进行尝试。直到到达终点。输出路线,记录下top,并比较minlen,若为最短路径存放人Path中。
相关文章推荐
- Cookie的增删改查
- Python基础系列----字典、基本语句
- CentOS 下安装 Hexo 博客
- 走遍世界 —— 亚洲
- Android Validation
- 局部刷新的js分页插件
- "MD5"加密算法全解析
- 密码学(公私匙加密)--逻辑思维题
- gulp 入门教程
- Android多线程文件下载
- js标准化价钱
- Unity5.2在VS2015中调试
- 在eclipse中使用Aspectj
- 使用Aspect来对访问方法进行预处理和后处理
- 仙侠情思——殊途
- eclipse中svn的各种图标详解
- Linux-Hadoop 安装和操作指南
- FindContours的算法原理
- microstation level3 02
- U-boot根目录下的config.mk分析