5-迷宫问题(华为机试)

news2024/11/20 11:25:33

题目

定义一个二维数组 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, 输入的内容只包含0 <= val <= 1。

输入描述:

输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只 有一条通道。

输出描述:

左上角到右下角的最短路径,格式如样例所示。

 


思路:广度优先遍历矩阵BFS

深度优先遍历(DFS)和广度优先遍历(BFS)

图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。遍历过程中得到的顶点序列称为图遍历序列。

图的遍历过程中,根据搜索方法的不同,又可以划分为两种搜索策略:

  • 深度优先搜索(DFS,Depth-First-Search)
  • 广度优先搜索(BFS,Breadth-First-Search)

实现深度优先遍历的关键在于回溯,实现广度优先遍历的关键在于回放。

1.深度优先遍历(DFS)——栈

主要思路是从图中一个未访问的顶点v开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底…,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路,再换一条路继续走。类似于树的前,中,后序遍历。

2. 广度优先遍历(BFS)——队列

设初始状态时图中的所有顶点未被访问,首先访问图中某指定的起始顶点v,并将其标记为已访问过,然后由v出发依次访问v的各个未被访问的邻接点v1,v2,…,vk;并将其均标识为已访问过,再分别从v1,v2,…,vk出发依次访问它们未被访问的邻接点,并使“先被访问顶点的邻接点”先于“后被访问顶点的邻接点”被访问。直至图中所有与顶点v路径相通的顶点都被访问到。类似于树的层序遍历。

代价相同的图中,广度优先遍历可以保证遍历到的目标点就是经过最短路径到达的点。为此可以创建一个Point类,属性为横纵坐标和父节点。从(0,0)出发,将经过的坐标点都设为1,避免重复经过而进入死循环。把当前点的上下左右值为0的点都加入队列中,直到遇见出口为止。遇到出口时,pos的father路径就是最短路径的逆路径。此时只需要把逆路径反转一下即可。(利用递归可以后序输出链表的特性,可以省去反转路径的操作)


代码

import java.util.*;

class Point {
    int px;
    int py;
    Point father;

    Point(int px, int py, Point father) {
        this.px = px;
        this.py = py;
        this.father = father;
    }

    Point() {}
}

public class Maze {
    public static void print(Point p) {
        if(p != null){
            print(p.father);
            System.out.println("(" + p.px + "," + p.py + ")");
        }
    }

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()) {
            int row = sc.nextInt();
            int col = sc.nextInt();
            int [][] grid = new int[row][col];
            for(int i = 0; i < row; ++i) {
                for(int j = 0; j < col; ++j) {
                    grid[i][j] = sc.nextInt();
                }
            }

            Queue<Point> que = new LinkedList<>();
            que.offer(new Point(0, 0, null));
            grid[0][0] = 1;
            Point pos = null;

            while(true) {
                pos = que.poll();
                int px = pos.px;
                int py = pos.py;
                if(px == row - 1 && py == col - 1) {
                    break;
                } else {
                    if(px + 1 < row && grid[px + 1][py] == 0) {
                        grid[px + 1][py] = 1;
                        que.offer(new Point(px + 1, py, pos));
                    }
                    if(py - 1 >= 0 && grid[px][py - 1] == 0) {
                        grid[px][py - 1] = 1;
                        que.offer(new Point(px, py - 1, pos));
                    }
                    if(px - 1 >= 0 && grid[px - 1][py] == 0) {
                        grid[px - 1][py] = 1;
                        que.offer(new Point(px - 1 ,py, pos));
                    }
                    if(py + 1 < col && grid[px][py + 1] == 0) {
                        grid[px][py + 1] = 1;
                        que.offer(new Point(px, py + 1, pos));
                    }
                }
            }

            print(pos);
        }
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通用模型切片处理过程 CesiumLab系列教程

我们前面把每种格式的模型参数设置已经讲解清楚&#xff0c;下面我们应该弄清楚通用模型切片剩下的流程&#xff0c;不管是人工模型&#xff0c;还是shp矢量面、bim模型&#xff0c;剩下的处理过程都是一样的&#xff0c;这里我们一起讲述。 资源库 ​通用模型处理分为两个过程…

基于JAVA的个人信息管理系统源码,含基于VUE的PC前端及移动端,用于管理个人消费、锻炼、音乐、阅读、健康、饮食等衣食住行信息

项目介绍 完整代码下载地址&#xff1a;基于JAVA的个人信息管理系统源码 用于管理个人消费、锻炼、音乐、阅读、健康、饮食、人生经历等各个衣食住行信息的系统&#xff0c;通过提醒、计划模块利用调度系统来统计分析执行情况。 并通过积分和评分体系来综合评估个人的总体状态…

【C++】类和对象【中篇】--C++六个默认成员函数以及const成员函数

文章目录一、类的6个默认成员函数二、构造函数1.概念2.特性2.1特征分析——自动生成2.2.特征分析——选择处理2.3特征分析——默认构造3.C11补丁——缺省值三、析构函数1.概念2.特征四、拷贝构造函数1.概念2.特征2.1引用分析——引用做参数2.2特征分析——深浅拷贝五、运算符重…

Clin Nutr | 浙大儿童医院-陈洁/倪艳揭示全肠内营养对儿童克罗恩病肠道菌群和胆汁酸代谢的影响...

全肠内营养对儿童克罗恩病肠道微生物群和胆汁酸代谢的影响The impact of exclusive enteral nutrition on the gut microbiome and bile acid metabolism in pediatric Crohns diseaseResearch article&#xff0c;2022年11月30日&#xff0c;Clinical Nutrition&#xff0c;7.…

Weblogic 任意文件上传漏洞(CVE-2018-2894)复现

目录 weblogic 漏洞环境准备 漏洞复现 修复建议 weblogic WebLogic是美国Oracle公司出品的一个application server&#xff0c;确切的说是一个基于JAVAEE架构的中间件&#xff0c;WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应…

Healthcare靶机总结

Healthcare靶机渗透总结 靶机下载地址: https://download.vulnhub.com/healthcare/Healthcare.ova 打开靶机,使用nmap扫描出靶机的ip和所有开放的端口 可以看到,靶机开放了21端口和80端口 21端口为ftp的端口,一般遇到这种,就可以考虑ftp的匿名登录,我们可以试一下 用户名anony…

【总结】华为、H3C、锐捷三家交换机配置命令详解

一直以来&#xff0c;对于华为、H3C、锐捷交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;三家交换机的配置命令容易弄混&#xff0c;经常在实际项目配置中出错&#xff0c;因此&#xff0c;本期我们将来介绍这三家交换机的基础配置命令&#xff0c;大家可以分别来看…

动手学区块链学习笔记(一):加密算法介绍

引言 本文根据实验楼以及自己查询到的一些资料&#xff08;文末给出&#xff09;&#xff0c;模拟了一下区块链从诞生到交易的整个过程&#xff0c;也算是弥补了一下之前区块链的一些缺失知识。 哈希加密原理介绍 什么是比特币&#xff1f; 比特币是一种加密货币&#xff0c…

【Python百日进阶-数据分析】Day223 - plotly瀑布图go.Waterfall()

文章目录一、语法二、参数三、返回值四、实例4.1 简单瀑布图4.2 多类别瀑布图4.3 设置标记大小和颜色4.4 水平瀑布图4.5 Dash中的应用一、语法 绘制瀑布轨迹&#xff0c;这是一种有用的图表&#xff0c;可以在条形图中显示各种元素&#xff08;正或负&#xff09;的贡献。y如果…

一文读懂mybatis连接池原理

本文需要配合代码demo一起观看更佳&#xff0c;源码地址。 本源码中对 mybatis代码做了详尽的注释。对mybatis源码进行了详尽的注释&#xff0c;且可以对项目进行install&#xff0c;然后在ron-man-mybatis1项目中 src/main/java/iron/man/lyf/ironmanmybatis1/run_test/Mybat…

亚马逊云科技启示录:创新作帆,云计算的征途是汪洋大海

开篇&#xff1a;创新是亚马逊云科技发展的最持久驱动力云计算&#xff0c;新世纪以来最伟大的技术进步之一&#xff0c;从2006年 Amazon Web Service 初创时的小试牛刀&#xff0c;到如今成长为一个巨大的行业和生态&#xff0c;已经走过16年的风雨历程。Java之父詹姆斯高斯林…

关于子查询

1、什么是子查询&#xff1a; select语句中嵌套select语句&#xff0c;被嵌套的select语句称为子查询。 2、子查询都可以出现在什么地方&#xff1a; select ..(select) #子查询可以出在select后面 from ..(select) #子查询可以出在from后面 where ..(select) …

操作系统考研复习(详细指导)--持续更新中

第一章操作系统的概念(定义)功能和目标操作系统的概念(定义)--什么是操作系统操作系统是指控制和管理整个计算机系统的硬件和软件资源(操作系统是系统资源的管理者)&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;以提供给用户和其他软件方便的接口和环境 &…

【Rtklib入门指南】1. Rtklib下载及编译

写在前面其实前几年还在校的时候出过一个还不太成熟的教程&#xff0c;回头看的时候发现有诸多不够成熟的地方&#xff0c;如今的工作自由时间相对较多&#xff0c;因此萌生了重新梳理&#xff0c;提升博客质量的想法。因此&#xff0c;就有了这个新的系列。对于大多数GNSS的从…

JMeter - 下载安装教程

目录1. JMeter介绍2. JMeter下载3. JMeter目录解析4. Windows和macOS下安装启动5. JMeter切换语言为中文6. Linux下安装启动1. JMeter介绍 JMeter是目前行业内用的比较多的一个开源性能测试工具&#xff0c;由Java语言编写&#xff0c;要依赖Java环境来运行&#xff08;需要提…

vtk.js中引入.module.css文件

我们知道css modules指的是所有的类名和动画名称默认都有各自作用域的CSS文件&#xff0c;是在构建步骤中对CSS类名和选择器限定作用域的一种方式&#xff08;类似于命名空间&#xff09;。通过CSS Modules可以保证单个组件的所有样式集中在同一个地方、只应用于该组件。它可以…

React记录

UI组件库&#xff1a;https://mobile.ant.design/zh/ 1、‘idname’ is not defined no-undef 情景&#xff1a;给属性绑定属性值时&#xff0c;明明设置了变量&#xff0c;使用语法也没有错误&#xff0c;但是提示却说是该变量未定义。 原因&#xff1a;变量的值不是字符串类…

SpringCloud学习笔记 - 服务熔断降级 - Sentinel

1. sentinel简介 sentinel官方文档&#xff1a;https://sentinelguard.io/zh-cn/docs/introduction.html 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&…

【Redis】缓存击穿问题及其解决方案

【Redis】缓存击穿问题及其解决方案 文章目录【Redis】缓存击穿问题及其解决方案1. 缓存击穿概念2. 解决方案2.1 互斥锁2.1.1 互斥锁的优缺点2.1.2 互斥锁的代码实现2.2 逻辑过期2.2.1 逻辑过期的优缺点2.2.2 逻辑过期的代码实现1. 缓存击穿概念 缓存击穿&#xff1a;缓存击穿…

13个有趣的Python高级脚本,建议收藏

上一篇文章&#xff1a;整理了上千个 Python 工具库&#xff0c;涵盖24个大方向 没想到火了&#xff0c;喜欢除了收藏外&#xff0c;记得点赞。 每天我们都会面临许多需要高级编码的编程挑战。你不能用简单的 Python 基本语法来解决这些问题。 在本文中&#xff0c;我将分享…