《啊哈算法》 解救小哈(深度优先算法——走迷宫实战) P86
#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相关推荐
- 解救小哈——DFS算法举例
一.问题引入 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了... 二. ...
- 啊哈算法—解救小哈(广度优先搜索)
解救小哈 小哈在一个(m * n)大小的迷宫(0 ⇐ m, n ⇐ 50)里迷路了.在迷宫中,每个单元格要么是空地,要么是障碍物.现在要找到从起点到小哈位置的最短步数. 思路: 使用队列储存扩展,扩展 ...
- (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)
链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构 队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...
- c语言老鼠走迷宫原理,C语言算法(3) 老鼠走迷宫
1.Algorithm Gossip: 老鼠走迷官(一)说明:老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法: ...
- 深度优先搜索—走迷宫
例题:走迷宫 1.需要一个终止条件, 2.需要四个搜索方向:上下左右: 3.并且需要使用bool进行标记一个方向是否访问过: 4.如果需要找到多个可行解,那么如果该方向可行,需要取消标记.如果只需要也 ...
- 深度优先搜索——走迷宫问题
题目大意: 用二维数组存储一个n * m的迷宫,0表示路,1表示墙.一个人位于左上角 (1,1)(1,1) 处,已知该人每次可以向上.下.左.右任意一个方向移动一个位置,求从左上角移动到右下角的最少次 ...
- 《阿哈!算法》4-1不撞南墙不回头 4-2 解救小哈——深度优先搜索
深度优先搜索关键在于解决"当下该如何做".至于"下一步如何做"则与当下该如何做"是一样的. 深度优先搜索模型: void dfs(int step){ ...
- 啊哈算法-DFS解救小哈python版
DFS 啊哈算法-解救小哈 maze_map = [] n,m = map(int,(input()).split()) maze_map = [input().split() for i in ra ...
- 应对笔试手写代码,如何准备深度优先算法 广度优先算法?
应对笔试手写代码,如何准备深度优先算法 & 广度优先算法? 1. 什么是深度优先算法?什么又是广度优先算法? 2. 广度优先算法使用场景 3. 广度优先算法模板 4. 深度优先算法使用场景 5 ...
最新文章
- Shiro01 功能点框图、架构图、身份认证逻辑、身份认证代码实现
- java 扩展类加载器_java实现自定义类加载器
- 在Indicator中添加动态Checkbox,无需绑定数据源,支持全选 - Ehlib学习(二)
- JVM内存模型、Java内存模型 和 Java对象模型
- cube、rollup及exec的用法实例
- 单片机学习--3D动画演示单片机工作原理
- 计算机科学 理学,077500计算机科学与技术(理学).doc
- 计算机设备间使用面积,【IBE】综合布线设计中的常用计算公式
- java去除字符串的空格,换行符,水平制表符,回车
- php use 多个,php中同时使用多个use导入命名空间时的问题
- 线上问题随笔记录数据库连接池问题
- Java应用程序的令牌认证
- Linux uart驱动框架
- java代码中发送http请求的DnsResolver使用问题
- 在vSphere Client使用模板部署虚拟机 系统硬盘空间扩展
- 计算机 行列式,行列式计算器
- Visual studio 2019 报错没有“dirent.h”文件
- win10本地Docker搭建青龙面板
- 超级详细的 Maven 教程(基础+高级)
- Fedora 15不能正常关机,总是卡死在关机画面上