如果可以,可以陪你千年不老,千年只想眷顾你倾城一笑;如果愿意,愿意陪你永世不离,永世只愿留恋你青丝白衣。

目录

如果可以,可以陪你千年不老,千年只想眷顾你倾城一笑;如果愿意,愿意陪你永世不离,永世只愿留恋你青丝白衣。

(一)使用栈

(二)使用队列

(三)使用递归

(四)使用图的遍历方法


(一)使用栈

问题描述:

给定一个M×N迷宫图入口与出口行走规则。求一条从指定入口到出口的路径。

所求路径必须是简单路径,即路径不重复。

设置一个迷宫数组mg,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块不可走。

在算法中用到的栈采用顺序栈存储结构,即将栈定义为:

typedef struct
{  int i;           //当前方块的行号int j;         //当前方块的列号int di;            //di是下一可走相邻方位的方位号
} Box;              //定义方块类型
typedef struct
{  Box data[MaxSize];int top;           //栈顶指针
}  StType;          //定义顺序栈类型

算法设计

用栈求一条迷宫路径的算法: (xiyið xeye

bool mgpath(int xi,int yi,int xe,int ye)
{Box path[MaxSize], e;int i,j,di,i1,j1,k;bool find;StType *st;               //定义栈stInitStack(st);           //初始化栈顶指针e.i=xi;e.j=yi;e.di=-1;      //设置e为入口Push(st,e);             //方块e进栈mg[xi][yi]=-1;  //入口的迷宫值置为-1避免重复走到该方块while (!StackEmpty(st))        //栈不空时循环{GetTop(st,e);          //取栈顶方块ei=e.i;j=e.j;di=e.di;if (i==xe && j==ye)      //找到了出口,输出该路径{printf("一条迷宫路径如下:\n");k=0;while (!StackEmpty(st)){Pop(st,e);       //出栈方块epath[k++]=e;  //将e添加到path数组中}while (k>=1){k--;printf("\t(%d,%d)",path[k].i,path[k].j);if ((k+2)%5==0)    //每输出每5个方块后换一行printf("\n");}printf("\n");DestroyStack(st);      //销毁栈return true;       //输出一条迷宫路径后返回true}find=false;while (di<4 && !find)   //找相邻可走方块(i1,j1){di++;switch(di){case 0:i1=i-1;j1=j;break;case 1:i1=i;j1=j+1;break;case 2:i1=i+1;j1=j;break;case 3:i1=i;j1=j-1;break;}if (mg[i1][j1]==0)  find=true;//找到一个相邻可走方块,设置find为真}if (find)               //找到了一个相邻可走方块(i1,j1){st->data[st->top].di=di;  //修改原栈顶元素的di值e.i=i1;e.j=j1;e.di=-1;Push(st,e);             //相邻可走方块e进栈mg[i1][j1]=-1;//(i1,j1)迷宫值置为-1避免重复走到该方块}else       //没有路径可走,则退栈{Pop(st,e); //将栈顶方块退栈mg[e.i][e.j]=0;//让退栈方块的位置变为其他路径可走方块}}DestroyStack(st);    //销毁栈return false;  //表示没有可走路径
}

建立如下主函数调用上述算法:

int main()
{  if  (!mgpath(1,1,M,N))printf("该迷宫问题没有解!");return 1;
}

(二)使用队列

使用一个队列qu记录走过的方块,该队列的结构如下:    

typedef struct
{  int i,j;     //方块的位置int pre      //本路径中上一方块在队列中的下标
}  Box;         //方块类型
typedef struct
{  Box data[MaxSize];int front,rear;    //队头指针和队尾指针
}  QuType;

这里使用的队列qu不是环形队列(因为要利用出队的元素找路径),因此在出队时,不会将出队元素真正从队列中删除,因为要利用它输出路径。

算法设计

用队列求一条迷宫路径的算法:(xiyið xeye

bool mgpath1(int xi,int yi,int xe,int ye)
//搜索路径为:(xi,yi)  (xe,ye)
{Box e;int i,j,di,i1,j1;QuType *qu;         //定义顺序队指针quInitQueue(qu);       //初始化队列que.i=xi;e.j=yi;e.pre=-1;enQueue(qu,e);       //(xi,yi)进队mg[xi][yi]=-1;       //将其赋值-1,以避免回过来重复搜索while (!QueueEmpty(qu))      //队不空循环{deQueue(qu,e);          //出队方块ei=e.i;j=e.j;if (i==xe && j==ye)        //找到了出口,输出路径{print(qu,qu->front);    //调用print函数输出路径DestroyQueue(qu);        //销毁队列return true;      //找到一条路径时返回真}for (di=0; di<4; di++)   //循环扫描每个方位{switch(di){case 0:i1=i-1;j1=j;break;case 1:i1=i;j1=j+1;break;case 2:i1=i+1;j1=j;break;case 3:i1=i;j1=j-1;break;}if (mg[i1][j1]==0){e.i=i1;e.j=j1;e.pre=qu->front;enQueue(qu,e);    //(i1,j1)方块进队mg[i1][j1]=-1; //将其赋值-1}}}DestroyQueue(qu);        //销毁队列return false;
}

(三)使用递归

mgpath(int xiint yiint xeint yePathType path)

求从(xiyi)(xeye)的迷宫路径,用path变量保存迷宫路径。

求解迷宫问题的递归模型如下:

迷宫路径用顺序表存储,它的元素由方块构成的。

PathType类型定义如下:

typedef struct
{  int i;           //当前方块的行号   int j;          //当前方块的列号
} Box;typedef struct
{  Box data[MaxSize];int length;            //路径长度
}  PathType;    

算法设计

void mgpath(int xi,int yi,int xe,int ye,PathType path)
//求解路径为:(xi,yi)    (xe,ye)
{int di,k,i,j;if  (xi==xe && yi==ye){path.data[path.length].i = xi;path.data[path.length].j = yi;path.length++;printf("迷宫路径%d如下:\n",++count);for (k=0; k<path.length; k++){printf("\t(%d,%d)",path.data[k].i, path.data[k].j);if ((k+1)%5==0)   //每输出每5个方块后换一行printf("\n");}printf("\n");}else          //(xi,yi)不是出口{if (mg[xi][yi]==0)   //(xi,yi)是一个可走方块{di=0;while (di<4)       //对于(xi,yi)四周的每一个相邻方位di{switch(di)       //找方位di对应的方块(i,j){case 0:i=xi-1;j=yi;break;case 1:i=xi;j=yi+1;break;case 2:i=xi+1;j=yi;break;case 3:i=xi;j=yi-1;break;} path.data[path.length].i = xi;path.data[path.length].j = yi;path.length++;        //路径长度增1 mg[xi][yi]=-1;       //避免来回重复找路径 mgpath(i,j,xe,ye,path); path.length--;    //回退一个方块mg[xi][yi]=0;      //恢复(xi,yi)为可走di++;}   //-while}     //- if (mg[xi][yi]==0)}    //-递归体
}

算法输出所有的迷宫路径,可以通过进一步比较找出最短路径(可能存在多条最短路径)。

使用下列主函数测试

void main()
{  PathType path;path.length=0; mgpath(1,1,4,4,path);
}

(四)使用图的遍历方法

创建迷宫问题的邻接表:

算法设计

(1)采用DFS或者BFS算法
(2)入口作为初始顶点
(3)结束条件为找到出口
(4)visited改为二维数组

具体实现方法参照:广搜:https://blog.csdn.net/weixin_44170305/article/details/90311053

深搜:https://blog.csdn.net/weixin_44170305/article/details/90297716

数据结构--迷宫问题的四种解法相关推荐

  1. 四种解法——求子序列的最大连续子序和(普通解法、求和解法、分治法、O(n)级解法)(面试经典题)

    励志用少的代码做高效表达 在这四种解法里,解法一是通法,可以学到规律和知识,做基础之用:解法二在解法一的基础上做改进,锻炼思维:解法三则是大名鼎鼎的分治法,涉及到递归的知识,算是"高效算法设 ...

  2. 算法-寻找数组中的重复值,四种解法

    算法-寻找数组中的重复值 寻找数组中的重复值 寻找数组中的重复值 题目来源于:Leetcode-287.本题归类到简单我无法理解-要满足四个条件需要用很特定的解法,面试中要是用到的话很可能是在给自己挖 ...

  3. python整数拆分dp算法_整数拆分问题的四种解法【转载】

    http://blog.csdn.net/u011889952/article/details/44813593 整数拆分问题的四种解法 原创 2015年04月01日 21:17:09 整数划分问题是 ...

  4. 奖券数目c语言答案,2015 年蓝桥杯 C 语言 B 组省赛第 1 题: 奖券数目 (四种解法 + 详细分析)...

    题目 奖券数目 有些人很迷信数字,比如带"4"的数字,认为和"死"谐音,就觉得不吉利. 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码 ...

  5. 【剑指Offer】剪绳子问题——四种解法

    剪绳子问题--四种解法 题目描述: 输入描述: 返回值描述: 示例1: 解题思路: 方法1:暴力递归 方法2:记忆化递归 方法三:动态规划 方法四,数学原理 题目描述: 给你一根长度为n的绳子,请把绳 ...

  6. 销售额超过公司均值的优秀经销商?SQL比例问题之分组比较的四种解法

    分组比较是看起来比较简单,但是写起来比较麻烦的问题,一般就是先进行两个不同分组计数.求和.求均值,然后两个均值作比较,这样就涉及表连接和判断,写的代码量就比其他问题多很多.它与连续问题.排名问题和累加 ...

  7. 八皇后问题详解(四种解法)

    所有源码都在github上(https://github.com/seasonyao/eight_queen_question) 如果你去百度百科八皇后这个问题,你会发现人家也是历史上有头有脸的一个问 ...

  8. 最长公共子序列长度的四种解法

    一.题目:求两个字符序列的最长公共字符子序列.给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB, ...

  9. 青蛙跳台阶c语言递归函数,青蛙跳台阶问题的四种解法

    http://raychase.iteye.com/blog/1337359 题目:一只青蛙一次可以跳1级台阶,也可以跳2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 这道题还被ITEye放在了博 ...

最新文章

  1. 最后一周报名微生物组-宏基因组分析(线上/线下同步开课,2020最后一期)
  2. 详解zabbix安装部署(Server端篇)
  3. python实训项目-实验楼Python项目
  4. 二分图的最大匹配(匈牙利算法)HDU1083
  5. vim进阶之202007命令记录
  6. 来自艾斯维尔的计算机科学系的期刊排行,研究生必备!
  7. UGUI_UGUI事件系统简述及使用方法总结
  8. JS设置cookie,删除cookie
  9. python scikit_如何将Scikit学习Python库用于数据科学项目
  10. 图书馆学应掌握计算机知识,图书馆学专业基础知识点整理.doc
  11. (附源码)flutter+React Native+Springboot Api
  12. 使用 Litho 改进 News Feed 上的 Android 视频表现
  13. 基于C++的简易的国际象棋双人对战程序设计
  14. 读书笔记 摘自:《智能商业》
  15. lpush和rpush的区别_redis数据类型之list-lpush,rpush讲解
  16. TO B是什么?TO C呢?
  17. Oracle 11g 停止正在运行的job
  18. oracle表的时区怎么查,ORACLE中的时区(time zone)
  19. android studio 遇到 app error launching怎么办?
  20. echarts 桑基图sankey

热门文章

  1. java类中获取tomcat下的webap路径方法
  2. pro4重影花屏 surface_【图】- 微软Surfacepro4会花屏模糊抖动怎么回事 - 厦门思明湖滨南路电脑维修 - 厦门百姓网...
  3. pythontuple数据类型_阿博的Python之路-详解Tuple数据类型
  4. 台式计算机配置什么音响好,用什么办法才能让台式的电脑不用音响就有声音
  5. RuntimeError: CUDA error: no kernel image is available for execution on the driver
  6. linux的下载利器——aira2 可以下载磁力链接
  7. [Unity]项目工程文件太大删除Library文件夹会怎么样
  8. Flutter 实现原理及跨平台实践
  9. [RK3399]电磁屏:优派viewsonic与扩展IO(PCA9534)
  10. 计算机与信息科学书刊,第五届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2020)...