经典算法之走迷宫

最经典的走迷宫最短路径算法(深度优先搜索BFS的典型实例) 迷宫的最短路径 问题描述 给定一个大小为N×M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四个的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。(N,M≤100) (’#’, ‘.’ , ‘S’, 'G’分别表示墙壁、通道、起点和终点) 样例输入: 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .####.###. . 阅读详情

问题描述:

...11111111111111111111111111111
11.111111........1111111111.1111
11.111111..111.11111111.....1111
11.11111111111.1111111111.111111
11.111111.................111111
11.111111.11111111111.11111.1111
11.111111.11111111111.11111..111
11..........111111111.11111.1111
11111.111111111111111.11....1111
11111.111111111111111.11.11.1111
11111.111111111111111.11.11.1111
111...111111111111111.11.11.1111
111.11111111111111111....11.1111
111.11111111111111111111111.1111
111.1111.111111111111111......11
111.1111.......111111111.1111.11
111.1111.11111.111111111.1111.11
111......11111.111111111.1111111
11111111111111.111111111.111...1
11111111111111...............1.1
111111111111111111111111111111..


如上图的迷宫,入口,出口分别:左上角,右下角
"1"是墙壁,"."是通路
求最短需要走多少步?


解题思路:

用*表示已走的路,用广度优先搜索求最短路径.


代码实现:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		String[] ss = input.nextLine().trim().split(" +");
		int n = Integer.parseInt(ss[0]);  //数组的第一部分为迷宫的长
		int m = Integer.parseInt(ss[1]);  //数组的第二部分为迷宫的宽
		
		char[][] data = new char[n][];
		for (int i = 0; i < n; i++) {
			data[i] = input.nextLine().trim().toCharArray();   //正文部分为迷宫的内部构造
		}
		
		Set<String> set = new HashSet<>();   //set用来保存走的路径
		set.add("0,0");  //将迷宫的左上角(0, 0)设为起点, 右下角设为终点
		System.out.println(fun(data, set, n-1 + "," +(m -1)));
	}

	public static int fun(char[][] data, Set<String> from, String goal) {
		if (from.contains(goal)) return 0;    //起点与终点重合,需要0步完成
		Set<String> set = new HashSet<>();     //from相邻的未访问的点
		
		for (Object obj : from) {
			String[] ss = ((String) obj).split(",");
			int y = Integer.parseInt(ss[0]);
			int x = Integer.parseInt(ss[1]);
			
			if (y > 0 && data[y - 1][x] == '.') {
				data[y - 1][x] = '*';
				set.add(y - 1 + "," + x);
			}
			if (y < data.length - 1 && data[y + 1][x] == '.') {
				data[y + 1][x] = '*';
				set.add(y + 1 + "," + x);
			}
			if (y > 0 && data[y][x - 1] == '.') {
				data[y][x - 1] = '*';
				set.add(y + "," + (x - 1));
			}
			if (y < data.length - 1 && data[y][x + 1] == '.') {
				data[y][x + 1] = '*';
				set.add(y + "," + (x + 1));
			}
		}
			
		if (set.isEmpty()) return -1;
		int r = fun(data, set, goal);    //分层遍历 广度优先遍历
		if (r < 0) return -1;   //找不到出口 返回-1
		return r + 1;
	}
}




github:https://github.com/striner/javaCode/blob/master/maze

【算法详解 | DFS算法】深度优先搜索解走迷宫问题 | 深度优先图遍历 本文将会详细讲解如何使用DFS算法解决走迷宫问题,一篇文章秒杀所有难点!内容简单直观,我家盆栽看完都学会了! 阅读详情

相关推荐

迷宫问题(回溯、栈)

描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。 本题含有多组数据。 数据范围: 2<= n,m <=10, 输入的内容

he__xu的博客 1388

数据结构与算法之走迷宫

数据结构与算法 Java实现走迷宫

liuffei的专栏 5280

【经典算法】老鼠走迷宫问题

老鼠走迷宫问题及其多个变种 说明 老鼠走迷宫问题的递归实现,是对递归思想的一种应用。 问题描述 给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图。给定入口位置和出口位置,判断之间是否存在通路并显示出走出迷宫的道路。 /*************************************************************************...

煮酒论英雄 9611

迷宫算法(DFS)

1.如果采用堆栈进行迷宫探测,则称之为深度优先搜索(DFS),它和递归的探测思路是基本一致的,可以看成是递归方式的非递归版本; 2.采用队列进行迷宫探测,则是广度优先搜索(BFS),广度优先搜索法利用队列的特点,一层层向外扩展查找可走的方块,直到找到出口为止,最先找到的这个答案就必然是最短的。 如果打比喻来说,DFS更适合模拟机器人走迷宫的方式,看到一个方向是通的,就一直走下去,遇到死胡同就退回;BFS则好比一个人站在迷宫入口处,拿出一堆小探测器,每个小探测器帮他搜索一个可能的路径去寻找,第一个找到出口的

m0_53157173的博客 1万+

经典算法五--老鼠走迷宫

说明: 老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1表示老鼠行走的路径,试以程式求出由入口至出口的路径。 代码:

qq_46000102的博客 1088

数据结构与算法之老鼠走迷宫问题

1. package mouseMazing; /** * @author:孙创 * @date:2017年3月12日 * @Discription:老鼠走迷宫 MAZE[i][j]=1;此处有墙,无法通过 MAZE[i][j]=0;此处无墙,可通过 * MAZE[1][1];入口,MAZE[ExitX][ExitY];出口。MAZE[i][j]=

chuangsun的博客 3526

经典算法50例 老鼠走迷宫1,2

本文来源和参考于经典算法50例。只不过把c换成java来实现。 老鼠走迷官(一) 说明 老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径。 解法 老鼠的走法有上、左、下、右四个方向,在每前进一格之后就选一个方向前进,无法前进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止,这是递回的基本题,请直...

小jinx的博客 4878

《BiLSTM with Multi-Polarity Orthogonal Attention for Implicit Sentiment Analysis》论文阅读笔记

文章名:《BiLSTM with Multi-Polarity Orthogonal Attention for Implicit Sentiment Analysis》 作者Jiyao Wei a,1, Jian Liaoa,1, Zhenfei Yanga, Suge Wanga,b,∗, Qiang Zhaoa 年份 2019 1 Introduction 目前文本情感分析多分析带...

weixin_39036944的博客 1630

数据结构经典算法学习之老鼠走迷宫02

老鼠走迷宫 基于上一遍博文的基础上,稍作修改,显示所有可达到的最近路线(这里指的最近就是不存在到达出口处还在别的出口来回走,额。。。可能没表达清楚,读者可以自己跑一下程序看看就明白了) 代码实现: package wj.arithmatic; public class Mourse {     int maze[][] = { { 2, 2, 2, 2, 2, 2,

皮皮王的专栏 9030

从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术

本文详细解析了EC11旋转编码器与ESP32的PWM控制技术,探讨了如何将机械旋转动作转换为精确的数字信号控制。通过硬件连接、信号处理和软件优化等实践技巧,开发者可以构建高效的人机交互系统,适用于智能照明、电机控制等多种应用场景。

android的专栏 785

STM32N6:MCU+NPU架构如何重塑边缘AI部署新范式

STM32N6作为业界首款MCU+NPU架构的通用微控制器,通过集成600 GOPS算力的NPU与800MHz Cortex-M55内核,实现了边缘AI部署的革命性突破。该方案在工业视觉和智能家居等场景中,以超低功耗和成本提供实时AI处理能力,性能较传统MCU提升超100倍,重塑了边缘智能设备的设计范式。

g8f9d0s1a2的博客 1291

数据结构经典算法学习之老鼠走迷宫01

老鼠走迷宫 故事背景:老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用0来表示老鼠的行走路径,试以程式求出由入口至出口的路径。 问题思考: 老鼠的走法有上、左、下、右四个方向,在每前进一格之后就选一个方向前进,无法前进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止 代码实现: package wj.arithmati

皮皮王的专栏 2971

深信服 SANGFOR 设备密码恢复和配置备份恢复

、恢复密码 当我们拿到一台设备要去配置管理的时候,首先是要确认设备的登录IP,其次就是确认设备控制台登录密码。不知情的情况下如何找到设备的登录IP,请参考文档: http://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=9484 下文中提到的关于“网关升级客户端”的一些功能,也请参考此文档。 那么恢复密码,大家都知道有2种方法:U盘恢复密码、交叉线恢复密码。 1、U盘恢复密码 注意:仅恢复admin密码,不影响配置。 U盘恢复密码的前

李先生在闯荡江湖 1万+

BFS经典算法-快来走迷宫

经典走迷宫,采用BFS解决,代码有详细的注释额

小知识吖 520

手把手教你学Simulink--基于故障诊断与容错控制的场景实例:电动汽车电机驱动系统的故障检测与隔离

本文介绍了基于Simulink的电动汽车电机驱动系统故障诊断与隔离(FDI)仿真建模方法。通过构建永磁同步电机(PMSM)驱动系统模型,实现了IGBT开路、电流传感器漂移等典型故障的注入与检测。重点阐述了基于观测器的残差生成方法,以及利用Stateflow实现的故障隔离逻辑。仿真结果表明,该系统能在85ms内准确识别故障类型,隔离准确率达97%,并支持容错控制。文章还探讨了AI故障预测、数字孪生等高级应用方向,为电动汽车电驱系统安全提供了完整的仿真解决方案。

MHD0815的博客 961

使用conda环境python3.13和python3.12下安装vllm过程记录

使用conda环境python3.13和python3.12下安装vllm过程记录

没刮胡子的程序员专栏 885

经典算法-遗传算法的解走迷宫例子

本文是遗传算法的一个示例,利用遗传算法来走迷宫,如果能从起点顺利走到终点,就能获胜。迷宫图中,绿点为迷宫起点,橙色点为迷宫终点。

Alex_StarSky的博客 942

Linux下搭建简易的HTTP服务器完成图片显示

篇文章作为Linux下socket(TCP)网络编程的练习,使用C语言代码搭建一个简单的HTTP服务器,完成与浏览器之间的交互,最终在浏览器上显示一张图片;通过这个例子可以巩固socket里多线程使用,也可以方便学习了解HTTP协议。

2588

老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)

C语言经典算法 - 老鼠走迷官(一)说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径。解法老鼠的走法有上、左、下、右四个方向,在每前进一格之后就选一个方向前进,无法前进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止,这是递回的基本题,请直接看程式应就可以理解。#include #inclu...

weixin_39832448的博客 172

基于Python的房地产评估数据抓取与分析 —— 房价走势与市场报告

在房地产行业中,了解和分析房产价格的变化趋势、各个地区的房价差异以及市场评价报告,可以帮助投资者、购房者以及政策制定者做出更加明智的决策。本文介绍了如何使用Python爬虫技术抓取房地产平台上的房产评估报告、价格走势等数据,并对抓取的数据进行分析。通过这些技术,您可以自动化抓取房地产平台的数据,分析房价走势,获取市场报告,为房地产投资决策提供数据支持。假设我们要从链家网抓取某个房产的价格、房产描述以及历史成交价格,首先需要获取目标房产页面的URL,并发送HTTP请求。伪装为常见浏览器,避免被识别为爬虫。

2201_76125261的博客 847

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c语言老鼠迷宫程序,C语言经典算法——老鼠走迷宫(二)

说明​由于迷宫的设计,老鼠走迷宫的入口至出口路径可能不只一条,如何求出所有的路径呢?​解法​求所有路径看起来复杂但其实更简单,只要在老鼠走至出口时显示经过的路径,然后退回上一格重新选择下一个位置继续递回就可以了,比求出单一路径还简单,我们的程式只要作一点修改就可以了。​#include"stdio.h"#include "stdlib.h"void visit(int,int);int start...

weixin_30785057的博客 815

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

龙生龙,凤生凤,老鼠儿子,会打洞,C语言经典算法之老鼠走迷宫

老鼠走迷官 老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径。 解析 老鼠的走法有上、左、下、右四个方向,在每前进一格之后就选一个方向前进,无法前进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止,这是递回的基本。 数据成员 绘制迷宫 访问处理 主函数 ...

莫影 is Joker 427

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

经典算法-(六)老鼠走迷宫

问题描述: 给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图。给定入口位置和出口位置,判断之间是否存在通路并显示出走出迷宫的道路。 问题解答: 实际上是使用回溯算法求解该问题,就是在上下左右四个方向试探,倘若有路则走一步,在新的位置继续在四个位置试探,并且对走过的路进行标记,倘若走到死胡同里,则退回上一步再来试探,以此类推,类似于图的深度优先算法,使用递归...

weixin_30666943的博客 309

C语言鼠图案,C语言经典算法 - 老鼠走迷官(一)

C语言经典算法 - 老鼠走迷官(一)2020-02-10编程之家https://www.jb51.cc编程之家收集整理的这篇文章主要介绍了C语言经典算法 - 老鼠走迷官(一),编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。下面是编程之家 jb51.cc 通过网络收集整理的代码片段。编程之家小编现在分享给大家,也给大家做个参考。@H_301_5@@H_301_5@@H_301_5@#i...

weixin_39736379的博客 262

C语言经典算法 - 老鼠走迷官(二)的代码

下边资料是关于C语言经典算法 - 老鼠走迷官(二)的内容,希望能对各位有一些好处。 #include <stdio.h> #include <stdlib.h> void visit(int, int); int maze[9][9] = {{2, 2, 2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 2, 0, 2, 2, 0, 2}, {2, 0, 2, 0, 0, 2, 0, 0, 2}, {2, 0,

haoguimi的博客 453

java学习----递归

【代码】java学习----递归。

qq_56798493的博客 289
上一篇: 经典算法之博弈论 高僧斗法
下一篇: 经典算法之并查集 合根植物
striner
博客等级 码龄9年 153粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值