#include <stdio.h>int n, m, p, q, min=999999; //n和m分别为行和列, p和q分别为终点的x,y坐标, min是最小步数 int a[51][51], book[51][51]; //a数组代表障碍物, book 数组标记已经走过的路void dfs(int x, int y, int step) ;int main() {int i, j, startX, startY;// 读入n和m, n为行, m为列scanf("%d %d", &n, &m);// 读入迷宫for(i=1; i<=n; i++)for(j=1; j<=m; j++)scanf("%d", &a[i][j]);// 读入起点和终点的坐标scanf("%d %d %d %d", &startX, &startY, &p, &q);// 从起点开始搜索book[startX][startY] = 1; //标记起点已经在路径中, 防止后面重复走// 第一个参数是起点的x坐标, 第二个参数是起点的y坐标, 第三个参数是初始步数为0dfs(startX, startY, 0);// 因为最小步数min被定义在了全局变量的位置, 所以dfs函数不需要返回值 // 输出最小步数 printf("%d", min);getchar(); getchar();return 0;
}void dfs(int x, int y, int step) {// 此处太妙了, 定义了一个二位数组next 来表示下一步行走的动作 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++) { // k代表了走的方向, next二位数组的第二个方括号代表了x和y // 计算下一个点的坐标tx = x + next[k][0];ty = y + next[k][1]; // !!! 判断是否越界if(tx<1 || ty<1 || tx>n || ty>m) {continue;} // 判断该点是否为障碍物 或 已经在路径中 (即判断下一步走的那个点是否合理, // 合理则进行递归, 不合理便继续循环 if(a[tx][ty]==0 && book[tx][ty]==0) { // a代表障碍物(1代表有,0代表无), book代表是否走过 book[tx][ty] = 1; //标记这个点已经走过dfs(tx, ty, step+1); //开始尝试下一个点book[tx][ty] = 0; //尝试结束, 取消这个点的标记 } } return;
}

《啊哈算法》 解救小哈(深度优先算法——走迷宫实战) P86相关推荐

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

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

  2. 啊哈算法—解救小哈(广度优先搜索)

    解救小哈 小哈在一个(m * n)大小的迷宫(0 ⇐ m, n ⇐ 50)里迷路了.在迷宫中,每个单元格要么是空地,要么是障碍物.现在要找到从起点到小哈位置的最短步数. 思路: 使用队列储存扩展,扩展 ...

  3. (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)

    链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构   队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...

  4. c语言老鼠走迷宫原理,C语言算法(3) 老鼠走迷宫

    1.Algorithm Gossip: 老鼠走迷官(一)说明:老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法: ...

  5. 深度优先搜索—走迷宫

    例题:走迷宫 1.需要一个终止条件, 2.需要四个搜索方向:上下左右: 3.并且需要使用bool进行标记一个方向是否访问过: 4.如果需要找到多个可行解,那么如果该方向可行,需要取消标记.如果只需要也 ...

  6. 深度优先搜索——走迷宫问题

    题目大意: 用二维数组存储一个n * m的迷宫,0表示路,1表示墙.一个人位于左上角 (1,1)(1,1) 处,已知该人每次可以向上.下.左.右任意一个方向移动一个位置,求从左上角移动到右下角的最少次 ...

  7. 《阿哈!算法》4-1不撞南墙不回头 4-2 解救小哈——深度优先搜索

    深度优先搜索关键在于解决"当下该如何做".至于"下一步如何做"则与当下该如何做"是一样的. 深度优先搜索模型: void dfs(int step){ ...

  8. 啊哈算法-DFS解救小哈python版

    DFS 啊哈算法-解救小哈 maze_map = [] n,m = map(int,(input()).split()) maze_map = [input().split() for i in ra ...

  9. 应对笔试手写代码,如何准备深度优先算法 广度优先算法?

    应对笔试手写代码,如何准备深度优先算法 & 广度优先算法? 1. 什么是深度优先算法?什么又是广度优先算法? 2. 广度优先算法使用场景 3. 广度优先算法模板 4. 深度优先算法使用场景 5 ...

最新文章

  1. Shiro01 功能点框图、架构图、身份认证逻辑、身份认证代码实现
  2. java 扩展类加载器_java实现自定义类加载器
  3. 在Indicator中添加动态Checkbox,无需绑定数据源,支持全选 - Ehlib学习(二)
  4. JVM内存模型、Java内存模型 和 Java对象模型
  5. cube、rollup及exec的用法实例
  6. 单片机学习--3D动画演示单片机工作原理
  7. 计算机科学 理学,077500计算机科学与技术(理学).doc
  8. 计算机设备间使用面积,【IBE】综合布线设计中的常用计算公式
  9. java去除字符串的空格,换行符,水平制表符,回车
  10. php use 多个,php中同时使用多个use导入命名空间时的问题
  11. 线上问题随笔记录数据库连接池问题
  12. Java应用程序的令牌认证
  13. Linux uart驱动框架
  14. java代码中发送http请求的DnsResolver使用问题
  15. 在vSphere Client使用模板部署虚拟机 系统硬盘空间扩展
  16. 计算机 行列式,行列式计算器
  17. Visual studio 2019 报错没有“dirent.h”文件
  18. win10本地Docker搭建青龙面板
  19. 超级详细的 Maven 教程(基础+高级)
  20. Fedora 15不能正常关机,总是卡死在关机画面上

热门文章

  1. 便民查询简介-markdown
  2. 判断是手机还是pc端登录
  3. 一些电机控制问题的记录
  4. 三月份学习总结与读后感
  5. Direct3D学习笔记(一)——精灵(Bomo_catcher游戏)
  6. 爱因斯坦在63岁时说
  7. vue图片时间轴滑动_Vue实现可移动水平时间轴
  8. 建议新手用3Dmax,那到底学好3Dmax要多久呢?
  9. div 内部元素出发 mouseout 和mouseover 事件解决
  10. k8s安全01--云安全简介