文章目录

  • 解救小哈
  • 完整代码
    • 读入数据
    • 输出数据
  • 总结

解救小哈

迷宫由n行m列的单元格组成(n和m都<=50),每个单元格要么是空地要么是障碍物。小哼要以最快的速度解救小哈,帮助小哼找到一条从迷宫起点通往小哈所在位置的最短路径。注:障碍物不能走,也不能走到迷宫之外。
首先我们可以用一个二维数组来储存这个迷宫,刚开始的时候,小哼处于迷宫的入口处(1,1),小哈在(p,q)。就是找从(1,1)到(p,q)的最短路径。小哼一开始在(1,1)他只能往右或者往下走。先让小哼往右边走,直到走不通了再回到这里,然后再走另外一个方向。规定按顺时针尝试(右,下,左,上)
我们先来看小哼一步之内到达的点有(1,2)和(2,1),先往右走走到(1,2),再往下走走到(2,2),因为仍然没有找到小哈,所以得继续走,直到无路可走或者找到小哈。但是需要注意,并不是找到小哈就结束了,因为这只是其中的一个路径,但不一定是最短的。现在我们尝试用DFS深度搜索来实现。DFS()处理的是当前应该怎么办。小哼面对的问题是,先检查自己是不是在小哈的位置,如果没有则找出下一步可以走的地方。我们设置3个参数,分别表示x的坐标,y坐标以及当前走过的步数step。

void DFS(int x, int y, int step)
{return;
}

判断是否已经到达小哈的位置,只需要比较当前坐标和小哈的坐标是否相等即可

void DFS(int x, int y, int step)
{//判断是否到达小哈的位置if (x == p && y == q){//更新最小值if (step < min)min = step;return;//这里的返回很重要}return;
}

如果没有找到小哈的位置,则找出下一步可以走的位置,因为有四个方向,按照之前的约定,右,下,左,上的顺序。我们定义一个方向数组next

 int next[4][2] = { {0,1},//向右走{1,0},//向下走{0,-1},//向左走{-1,0} };//向上走

通过这个方向数组,使用循环很容易获得下一步的坐标。将下一步的横坐标用tx存储,纵坐标用ty存储。

 for (k = 0; k <= 3; k++){//计算的下一个点的坐标tx = x + next[k][0];ty = y + next[k][1];}

再对(tx,ty)判断是否越界,是否遇到障碍物,是否重复。用book[tx][ty]记录格子是否已经在路径中
如果这个点符合所有的要求,就看下一个点,此时用到递归DFS(tx,ty,step+1)

     for (k = 0; k <= 3; k++){//计算的下一个点的坐标tx = x + next[k][0];ty = y + next[k][1];//判断是否越界if (tx<1 || tx>n || ty<1 || ty>m)continue;//判断障碍物或者重复if (a[tx][ty] == 0 && book[tx][ty] == 0){book[tx][ty] = 1;//标记这个点已经走过DFS(tx, ty, step + 1);//开始尝试下一个点book[tx][ty] = 0;//尝试结束,取消这个点的标记}}

完整代码

#include<stdio.h>
int n, m, p, q, min = 99999999;
int a[51][21], book[51][51];
void DFS(int x, int y, int step)
{int next[4][2] = { {0,1},//向右走{1,0},//向下走{0,-1},//向左走{-1,0} };//向上走int tx,ty,k;//判断是否到达小哈的位置if (x == p && y == q){//更新最小值if (step < min)min = step;return;//这里的返回很重要}//枚举四种走法for (k = 0; k <= 3; k++){//计算的下一个点的坐标tx = x + next[k][0];ty = y + next[k][1];//判断是否越界if (tx<1 || tx>n || ty<1 || ty>m)continue;//判断障碍物或者重复if (a[tx][ty] == 0 && book[tx][ty] == 0){book[tx][ty] = 1;//标记这个点已经走过DFS(tx, ty, step + 1);//开始尝试下一个点book[tx][ty] = 0;//尝试结束,取消这个点的标记}}return;
}
int main()
{int i, j, startx, starty;//读入n和m,n为行,m为列scanf_s("%d %d", &n, &m);//读入迷宫for (i = 1; i <= n; i++)for (j = 1; j <= m; j++)scanf_s("%d", &a[i][j]);//读入起点和终点坐标scanf_s("%d %d %d %d", &startx, &starty, &p, &q);//从起点开始搜索book[startx][starty] = 1;//标记起点已经在路径中,防止后面重复走//第一个参数是起点x的坐标,第二个参数是起点y的坐标,第三个参数是初始化步数0DFS(startx, starty, 0);//输出最短步数printf("%d", min);getchar(); getchar();return 0;
}

读入数据

输入以下数据进行验证。第一行代表迷宫的行和列;0和1代表空地和障碍物。最后一行代表入口x和y的坐标,后两个为小哈的x和y的坐标

5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3

输出数据

7

总结

我们仍然要明确DFS算法是解决当前面临的问题,找到当前需要解决的问题,就能写出DFS函数。

迷宫问题(解救小哈)相关推荐

  1. 解救小哈(dfs或bfs)

    题目描述: 有一天,小哈一个人去玩迷宫.但是方向感很不好的小哈很快就迷路了.小哼得知后便立即去解救无助的小哈.小哼当然是有备而来,已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.问题就此开始 ...

  2. (四)万能的搜索 —— 2. 解救小哈

    2. 解救小哈 任务: 迷宫由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是障碍物. 任务是帮助小哼找到一条从迷宫的起点通往小哈所在位置的最短路径.注意障碍物是不能走的,当 ...

  3. 问题 F: 解救小哈

    题目描述 有一天,小哈一个去玩迷宫.但是方向感很不好的小哈很快就迷路了.小哼得知后便立即去解救无助的小哈.小哼当然是有备而来,已经弄清楚了迷宫地图,现在小哼要以最快速度去解救小哈.问题就此开始了-- ...

  4. 12032 解救小哈

    标题: 解救小哈 标签: 搜索 广度优先搜索 详情: 有一天,小哈一个去玩迷宫.但是方向感很不好的小哈很快就迷路了.小哼得知后便立即去解救无助的小哈.小哼当然是有备而来,已经弄清楚了迷宫地图,现在小哼 ...

  5. JAVA算法:解救小哈(JAVA版)

    JAVA算法:解救小哈(JAVA版) 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那 ...

  6. 解救小哈(深度优先,广度优先)

    题目描述: 有一天,小哈一个去玩迷宫.但是方向感很不好的小哈很快就迷路了.小哼得知后便立即去解救无助的小哈.小哼当然是有备而来,已经弄清楚了迷宫地图,现在小哼要以最快速度去解救小哈.问题就此开始了-- ...

  7. 蓝桥杯:解救小哈最短路径

    bfs解救小哈最短路径 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了- ...

  8. 解救小哈——广度优先搜索bfs

    有一天,小哈一个去玩迷宫.但是方向感很不好的小哈很快就迷路了.小哼得知后便立即去解救无助的小哈.小哼当然是有备而来,已经弄清楚了迷宫地图,现在小哼要以最快速度去解救小哈.问题就此开始了-- 迷宫由n行 ...

  9. 解救小哈——DFS算法举例

    一.问题引入 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了... 二. ...

最新文章

  1. 第十五届全国大学生智能车安徽赛区参赛须知和竞赛日程安排
  2. Redis 压缩列表原理与应用分析
  3. SQLSERVER2008--日志收缩 or 日志清理
  4. Windows下使用taskkill 命令批量结束进程
  5. 密文恢复出明文的过程称为_整流二极管的反向恢复过程图解
  6. 机器学习基础算法15-回归实例-线性回归、Ridge回归、LASSO、ElasticNet的高阶参数与过拟合以及TSS>=ESS+RSS代码验证
  7. 四因素三水平正交试验表_正交实验设计过程
  8. Ubuntu 15.10 x64 安装 Android SDK
  9. Interfacing with Pixhawk using the NSH
  10. ASCII编码以及转换
  11. java json parser_自己实现JSON解析器 JsonParser
  12. 1.01_AFNetworking(4.0.1)源码分析(一)
  13. Android代码动态设置圆角,颜色,线条背景
  14. 新塘单片机烧写器_ICP Programming Tool下载|新唐单片机烧录工具ICP Programming Tool v3.00.6909 官方版 下载 - 巴士下载站...
  15. 制作一个心率/脉搏测量硬件
  16. 用java下载html页面
  17. 资深程序员--赵志刚 zz
  18. Ubuntu18 + laravel + JavaBridge + 招行国密加解密
  19. 世界各国领土面积排行(第二个版本)
  20. 全球DAG区块链联盟会议——问答(一)

热门文章

  1. OpenGL学习笔记——坐标转换
  2. Talk预告 | 普渡大学王虓:如何利用合作对抗学习来提升自监督学习
  3. 审视AI界的“SOTA成瘾”丨AI学者万字论述
  4. vs2015调试时无法显示QString变量的值,只显示地址
  5. Elastic: ILM与rollover的关系
  6. 三星矫情,重温Galaxy S5发布会收买人心
  7. 张一鸣应该接过张近东的枪
  8. 垃圾小白羊leetcode刷题记录1
  9. AES算法在Wi-Fi加密中的应用
  10. 2020-10-23 集合+序列化+递归+多线程+泛型+枚举+单例+反射小记