华为OD机试 - 机器人走迷宫 - 深度优先搜索dfs(Java 2023 B卷 200分)

news2024/11/17 3:55:52

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、深度优先搜索dfs
    • 六、Java算法源码
    • 七、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

  1. 房间由XY的方格组成,例如下图为24的大小。每一个方格以坐标(x,y)描述;
  2. 机器人固定从方格(0,0)出发,只能向东或者向北前进。出口固定为房间的最东北角,如下图的方格(5,3)。用例保证机器人可以从入口走到出口;
  3. 房间有些方格是墙壁,如(4,1),机器人不能经过那儿;
  4. 有些地方是一旦到达就无法走到出口的,如标记为B的方格,称之为陷阱方格;
  5. 有些地方是机器人无法到达的的,如标记为A的方格,称之为不可达方格,不可达方格不包括墙壁所在的位置;
  6. 如下示例图中,陷阱方格有2个,不可达方格有3个;
  7. 请为该机器人实现路径规划功能: 给定房间大小、墙壁位置,请计算出陷阱方格与不可达方格分别有多少个。

二、输入描述

  1. 第一行为房间的X和Y (0 < X,Y = 1000)
  2. 第二行为房间中墙壁的个数N (0 = N< X*Y)

同一行中如果有多个数据以一个空格隔开,用例保证所有的输入数据均合法。 (结尾不带回车换行)

三、输出描述

陷阱方格与不可达方格数量,两个信息在一行中输出,以一个空格隔开。(结尾不带回车换行)

在这里插入图片描述

在这里插入图片描述

四、解题思路

  1. 第一行输入行数m、列数n;
  2. 第二行输入墙数wallNum;
  3. 下面的wallNum行,输入墙的坐标;
  4. 定义二维矩阵matrix,并进行初始化,默认0,墙为-1;
    • 0:不可达,因为默认是0,向x和y正方向一步一步走的话,如果未涉及,就是不可达,所以是0;
    • -1:墙;
    • 1:可达;
    • -2:陷阱;
  5. 通过深度优先搜索dfs,遍历matrix;
    • 如果x或y正向都可达,则将其设为可达1;
    • 如果x或y正向都不可达,则将其设为陷阱-2;
  6. 遍历matrix;
    • 如果此时为0,表示不可达;
    • 如果此时为-2,表示陷阱;
  7. 按照指定格式输出陷阱和不可达的数量。

五、深度优先搜索dfs

在我们遇到的一些问题当中,有些问题我们不能够确切的找出数学模型,即找不出一种直接求解的方法,解决这一类问题,我们一般采用搜索的方法解决。搜索就是用问题的所有可能去试探,按照一定的顺序、规则,不断去试探,直到找到问题的解,试完了也没有找到解,那就是无解,试探时一定要试探完所有的情况(实际上就是穷举);

对于问题的第一个状态,叫初始状态,要求的状态叫目标状态。
搜索就是把规则应用于实始状态,在其产生的状态中,直到得到一个目标状态为止。
产生新的状态的过程叫扩展(由一个状态,应用规则,产生新状态的过程)。

搜索的要点:

  1. 初始状态;
  2. 重复产生新状态;
  3. 检查新状态是否为目标,是结束,否转(2);

如果搜索是以接近起始状态的程序依次扩展状态的,叫宽度优先搜索。

如果扩展是首先扩展新产生的状态,则叫深度优先搜索。

深度优先搜索用一个数组存放产生的所有状态。

  1. 把初始状态放入数组中,设为当前状态;
  2. 扩展当前的状态,产生一个新的状态放入数组中,同时把新产生的状态设为当前状态;
  3. 判断当前状态是否和前面的重复,如果重复则回到上一个状态,产生它的另一状态;
  4. 判断当前状态是否为目标状态,如果是目标,则找到一个解答,结束算法;
  5. 如果数组为空,说明无解。

六、Java算法源码

private static int m;// 行数
private static int n;// 列数
private static int wallNum;// 墙数
private static int[][] matrix;// 二维矩阵

/**
 * 0:不可达,因为默认是0,向x和y正方向一步一步走的话,如果未涉及,就是不可达,所以是0
 * -1:墙
 * 1:可达
 * -2:陷阱
 */
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int[] input = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
    m = input[0];
    n = input[1];
    wallNum = Integer.valueOf(sc.nextLine());

    matrix = new int[m][n];
    matrix[m - 1][n - 1] = 1; // 可达1
    for (int i = 0; i < wallNum; i++) {
        int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        matrix[arr[0]][arr[1]] = -1; // 墙-1,默认为0
    }

    dfs(0, 0);

    int trapNum = 0; // 陷阱
    int inaccessibleNum = 0; // 不可达

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] == 0) {// 不可达
                inaccessibleNum++;
            }else if (matrix[i][j] == -2) {// 陷阱
                trapNum++;
            }
        }
    }

    System.out.println(trapNum + " " + inaccessibleNum);
}

public static boolean dfs(int x, int y) {
    if (x >= m || y >= n) {// 非法输入
        return false;
    }
    if (matrix[x][y] == -1) {// 墙
        return false;
    }
    if (matrix[x][y] == -2) {// 不可达
        return false;
    }
    if (matrix[x][y] == 1) {// 可达
        return true;
    }

    if (matrix[x][y] == 0) {
        boolean step_x = dfs(x + 1, y);
        boolean step_y = dfs(x, y + 1);

        // 如果x或y正向都可达,则将其设为可达1
        if (step_x || step_y) {
            matrix[x][y] = 1;
        } else {// 如果x或y正向都不可达,则将其设为陷阱-2
            matrix[x][y] = -2;
        }
    }
    return matrix[x][y] == 1;
}

七、效果展示

1、输入

6 4
5
0 2
1 2
2 2
4 1
5 1

2、输出

2 3

3、说明

在这里插入图片描述


🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

Sosyal Lig Arena VoxEdit 比赛

召集所有体素艺术家和足球爱好者&#xff01;准备好彻底改变足球世界了吗&#xff1f; 我们邀请所有艺术家参加 VoxEdit 未来足球比赛。这场激动人心的比赛向你们发出挑战&#xff0c;请使用 VoxEdit 想象元宇宙中足球的未来。 发挥你们的创造力&#xff0c;展望未来的足球世…

半导体即国家,日本做了啥?最大的 AI 模型并不十分透明;特斯拉安全数据报告缺失近一年丨 RTE 开发者日报 Vol.70

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

香港服务器在国内访问太慢怎么能提高?

​  一直以来&#xff0c;全球化业务需求的增长是跟随着蓬勃向上的互联网而发展的。有了网络&#xff0c;海外贸易就在鼠标的轻点中完成。而IDC市场中的香港服务器也因为免备案政策的特性&#xff0c;开始逐渐成为企业想要跨越地域壁垒而考虑的对象。但在使用过程中&#xff…

视频号下载助手中的小程序怎么用?微信视频号提取下载教程

​用过视频号视频下载助手都说好用&#xff0c;但还有不少人不知道如何操作&#xff0c;怎么才能快速提取视频号视频呢&#xff1f;今天就分享两个工具【视频下载助手】和【视频下载bot】两个结合的方式进行下载&#xff0c;具体操作看教程。 在微信客户端中搜索提取机器人&…

开关电源芯片好坏的判断标准是什么?如何判断电源芯片的好坏?

电源芯片是电子设备的一个重要元件&#xff0c;如果电源芯片损坏&#xff0c;那么设备也将停止工作。开关电源芯片是一种电源管理器件&#xff0c;可以将输入电压转换为稳定的输出电压。为了开关电源芯片可以正常稳定运行以及电子设备可以正常工作&#xff0c;对于电源芯片的检…

Java面试题:链表-合并两个排序的链表

描述 输入两个递增的链表&#xff0c;单个链表的长度为n&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 示例 输入&#xff1a; {1,3,5}, {2,4,6}返回值&#xff1a; {1,2,3,4,5,6}原题地址&#xff1a;https://www.nowcoder.com/practice/d8b6b4358f7742…

域控操作三:给域用户本地管理员权限

登录本地管理账号 右键此电脑–管理–本地用户和组–组—双击administrators 一般来说会有本地管理账号和域控的已缓存账号 点击添加–高级–输入域控管理员账号 搜索这个电脑使用人添加进去。重启电脑即可

【Java】ArrayList集合使用

ArrayList集合常见方法 方法名称说明public boolean add(E e)将元素插入到指定位置的arraylist中&#xff0c;返回值&#xff1a;返回boolean类型public E remove(int index)删除 arraylist里的单个元素&#xff0c;返回值&#xff1a;返回删除之前的元素public E set(int inde…

ESP32集成开发环境Espressif-IDE安装 – Windows

陈拓 2023/10/15-2023/10/16 1. 概述 Espressif IDE是一个基于Eclipse CDT的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于使用ESP-IDF框架开发物联网应用程序。这是一个专门为ESP-IDF构建的独立定制IDE。Espressif IDE附带了IDF Eclipse插件、重要的Eclipse CDT插…

VMware下linux中ping报错unknown host的解决办法

一、错误截图 二、解决办法 2.1 按照步骤查看本机虚拟IP 依次点击&#xff1a;【编辑】》【虚拟网络编辑器】&#xff0c;选中NET模式所属的行&#xff0c;就能看到子网地址。 比喻&#xff0c;我的子网地址是&#xff1a;192.168.18.0 那么&#xff0c;接下来要配置的linux…

Pyside6 资源系统和资源文件使用

Pyside6 资源系统和资源文件使用 资源系统使用创建资源管理器编译qrc文件调用资源文件 在开发APP过程中&#xff0c;经常需要使用一些文件&#xff0c;图片之类的资源&#xff0c;这些资源都有一个特点&#xff0c;就是跟用户的使用环境无关&#xff0c;也就是说必须独立于系统…

留学教育咨询机构如何通过软文强势突围

近年来留学市场逐渐回暖&#xff0c;但是行业竞争也更加激烈&#xff0c;留学教育咨询机构想要在激烈的市场竞争中强势突围&#xff0c;除了优秀的职业素养&#xff0c;专业的服务态度外&#xff0c;还需要具备品牌形象打造和推广的能力&#xff0c;也有不少留学机构找盒子进行…

Altium Designer 20.2.3绘制51单片机最小系统

1、在电脑中建立一个自定义的文件夹&#xff0c;以备存储设计文件用。双击打开“X2.EXE” 运行文件&#xff0c;进入软件工作界面。 2、创建工程文件&#xff1a;单击“文件”菜单&#xff0c;选择“新的”选项中的“项目”选项&#xff0c;在“Project Name”中将工程文件保存…

忽略SSL证书校验过程,重写其中的certificateError方法

Qt实现简单的显示网页&#xff08;QtWebkit、QtWebEngine、QAxWidget&#xff09;_qt 显示网页-CSDN博客 更多QtWebkit资料 更多QtWebEngine资料 更多QAxWidget 资料 关于根据CEF封装QCef学习QCef及CEF学习 Qt WebEngine&#xff08;01&#xff09;&#xff1a;Qt WebEngin…

3D一代拳王

欢迎来到程序小院 一代拳王 玩法&#xff1a; 鼠标点击下方技能出拳&#xff0c;长按鼠标进行防御&#xff0c;不同种类的拳王&#xff0c;攻击力、速度、体质不同等级&#xff0c;快去解锁全部拳王进行拳王争霸吧^^。开始游戏https://www.ormcc.com/play/gameStart/191 html …

做好库存周转,再也不用担心企业效益

库存周转率对于企业的库存管理来说具有非常重要的意义。例如制造商&#xff0c;它的利益是由资金→原材料→产品→销售→资金的循环活动中产生的&#xff0c;如果这种循环很快也就是周转快时&#xff0c;在同额资金下的利益率也就高。 因此&#xff0c;周转的速度代表了企业利…

python文件中设置环境变量

import os os.environ[KMP_DUPLICATE_LIB_OK] True

已经拒了3个Offer了,心痛

今天早上在刷到这样一个帖子&#xff0c;如标题所见&#xff1a;已经拒了3个Offer了&#xff0c;心痛。今年的行情就是这样&#xff0c;旱的旱死涝的涝死&#xff0c;有的小伙伴在苦苦等一个 offer&#xff0c;对&#xff0c;一个就行&#xff1b;有的小伙伴就必须在多个 offer…

模块电源(五):DC-自举电容

一、DC控制器 1、TLV62569&#xff08;不需自举电容&#xff09; TLV62569数据手册中&#xff0c;典型应用电路如下所示&#xff1a; 2、MT2492&#xff08;需要自举电容&#xff09; MT2492数据手册中&#xff0c;典型应用电路如下所示&#xff1a;其中 C2 为自举电容 二、…

关闭计算机时弹出等待后台程序关闭提示的处理方法

1、单击“开始运行”&#xff0c;输入gpedit.msc&#xff0c;然后在运行过程中按Enter。 2、然后打开组策略编辑器并展开&#xff1a;计算机配置→管理模板→系统→关闭选项。 3、双击关闭右侧将阻止或取消关闭应用程序的自动终止功能。在属性中将其设置为Enabled并完成设置。