欢乐的周末 - 华为OD统一考试

OD统一考试

题解: Java / Python / C++

alt

题目描述

小华和小为是很要好的朋友,他们约定周末一起吃饭。

通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达)。求小华和小为都能到达的聚餐地点有多少个?

输入描述

第一行输入m和n,m代表地图的长度,n代表地图的宽度

第二行开始具体输入地图信息,地图信息包含:

0 为通畅的道路

1 为障碍物 (且仅1为障碍物)

2 为小华或者小为,地图中必定有且仅有2个(非障碍物)

3 为被选中的聚餐地点 (非障碍物)

输出描述

可以被两方都到达的聚餐地点数量,行末无空格

示例1

输入:
4 4
2 1 0 3
0 1 2 1
0 3 0 0
0 0 0 0

输出:
2

说明:第一行输入地图的长宽为4,4,接下来4行是地图2表示华为的位置,3是聚餐地点,图中的两个3,小华和小为都可到达,所以输出2

示例2

输入
4 4
2 1 2 3
0 1 0 0
0 1 0 0
0 1 0 0

输出
0

题解

这是一个 **DFS(深度优先搜索)**来解决的问题,主要目标是找到两个人(小华和小为)分别从他们的起点出发,能够到达的聚餐地点的交集。

主要思路是从两个起点分别进行深度优先搜索,并用一个二维数组 vis 记录访问状态。

在 DFS 过程中,将访问的位置的对应位设置为1,表示这个位置被访问过。

最后,遍历所有聚餐地点,如果两个人都能到达的地点,就将结果加一。

Java

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {
    private static int m, n;

    private static void dfs(int[][] g, int r, int c, int[][] vis, int seq) {
        if (r < 0 || c < 0 || r >= m || c >= n || g[r][c] == 1 || ((vis[r][c] & (1 << seq)) != 0)) {
            return;
        }
		
        // 第 seq 个人访问(i,j) 则将 vis[i][j] 的二进制第 seq 位变为 1
        vis[r][c] |= (1 << seq);

        dfs(g, r + 1, c, vis, seq);
        dfs(g, r - 1, c, vis, seq);
        dfs(g, r, c + 1, vis, seq);
        dfs(g, r, c - 1, vis, seq);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        m = scanner.nextInt();
        n = scanner.nextInt();

        int[][] g = new int[m][n];
        int[][] vis = new int[m][n];

        // 起点位置(小华或者小为的位置)
        List<int[]> starts = new ArrayList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                g[i][j] = scanner.nextInt();
                if (g[i][j] == 2) starts.add(new int[]{i, j});
            }
        }

        for (int i = 0; i < 2; i++) {
            int[] pos = starts.get(i);
            dfs(g, pos[0], pos[1], vis, i);
        }

        int result = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                // 聚餐地点 && 两次都访问到
                if (g[i][j] == 3 && vis[i][j] == 3) {
                    result++;
                }
            }
        }

        System.out.println(result);
    }
}

Python

def dfs(g, r, c, vis, seq):
    if r < 0 or c < 0 or r >= m or c >= n or g[r][c] == 1 or (vis[r][c] & (1 << seq)) != 0:
        return

    # 第 seq 个人访问(i,j) 则将 vis[i][j] 的二进制第 seq 位变为 1
    vis[r][c] |= (1 << seq)

    dfs(g, r + 1, c, vis, seq)
    dfs(g, r - 1, c, vis, seq)
    dfs(g, r, c + 1, vis, seq)
    dfs(g, r, c - 1, vis, seq)


m, n = map(int, input().split())

g = [list(map(int, input().split())) for _ in range(m)]
vis = [[0] * n for _ in range(m)]


# 起点位置(小华或者小为的位置)
starts = [(r, c) for r in range(m) for c in range(n) if g[r][c] == 2]
for seq, (r, c) in enumerate(starts):
    dfs(g, r, c, vis, seq)


result = sum(1 for r in range(m) for c in range(n) if g[r][c] == 3 and vis[r][c] == 3)
print(result)

C++

#include <iostream>
#include <vector>
#include <utility>

using namespace std;

int m, n;

void dfs(vector<vector<int>>& g, int r, int c, vector<vector<int>>& vis, int seq) {
    if(r < 0 || c < 0 || r >= m || c >= n || g[r][c] == 1 || (vis[r][c] & (1 << seq))) return;

    vis[r][c] |= (1 << seq);
	
    dfs(g, r + 1, c, vis, seq);
    dfs(g, r - c, c, vis, seq);
    dfs(g, r, c + 1, vis, seq);
    dfs(g, r, c - 1, vis, seq);
}


int main() {
    cin >> m >> n;
    vector<pair<int, int>> starts; // 起点位置(小华或者小为的位置)
    vector<vector<int>> g(m, vector<int>(n, 0));
    for(int i=0; i<m; i++) {
        for(int j=0; j<n; j++) {
            cin >> g[i][j];
            if(g[i][j] == 2) {
                starts.push_back({i, j});
            }
        }
    }

    // vis[i][j] 表示访问状态, 第 seq 个人访问(i,j) 则将 vis[i][j] 的二进制第 seq 位变为 1
    vector<vector<int>> vis(m, vector<int>(n, 0));
    for(int i=0; i < 2; i++) {
        dfs(g, starts[i].first, starts[i].second, vis, i);
    }


    int result = 0;
    for(int i=0; i<m; i++) {
        for(int j= 0; j<n; j++) {
            // 聚餐地点 && 两次都访问到
            if(g[i][j] == 3 && vis[i][j] == 3) {
                result ++;
            }
        }
    }

    cout << result << endl;

    return 0;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试宝典之spring框架常见面试题

F1、类的反射机制有啥用&#xff1f; &#xff08;1&#xff09;增加程序的灵活性&#xff0c;可扩展性&#xff0c;动态创建对象。 &#xff08;2&#xff09;框架必备&#xff0c;任何框架的封装都要用反射。&#xff08;框架的灵魂&#xff09; F2、获取Class对象的三种方…

Windows解决.conda文件夹占用C盘空间过大的问题

背景&#xff1a;C盘空间被.conda文件占用16G&#xff0c;主要原因是里面存放了python环境&#xff0c;提前进行环境迁移&#xff0c;防止后面环境增长C盘空间不足 解决办法&#xff1a; 1. .conda文件备份 2. 将.conda文件夹中的envs内容复制到Anaconda的安装目录下D:\Softwa…

借助AI识别网关实现高空坠物监测预警

高空坠物危害着民众的人身财产安全&#xff0c;有些高空坠物是来源于违法的高空抛物行为&#xff0c;也有一些是来源于高层建筑施工不规范、建筑设施老化、意外事故等因素。 无论哪种类型的高空坠物&#xff0c;都可以借助AI智能网关搭建坠物识别监测预警系统&#xff0c;实现对…

【大模型】大型模型飞跃升级—文档图像识别领域迎来技术巨变

写在前面 2023年12月31日&#xff0c;第十九届中国图象图形学学会青年科学家会议在广州举行&#xff0c;由中国图象图形学学会主办。 该会议的目标是促进青年科学家之间的交流与合作&#xff0c;以提升我国在图像图形领域的科研水平和创新能力。 由中国图象图形学学会和上海合合…

代码随想录算法训练营第二十四天| 回溯 491.递增子序列 46.全排列 47.全排列 II

491. 非递减子序列 此前通过used数组去重的操作的前提是需要首先给数组排序&#xff0c;本题不可以&#xff0c;因为求递增子序列时&#xff0c;原先的序列并不是一定递增的&#xff0c;此时进行排序后&#xff0c;此时递增子序列会包含其他原先不是原先数据的子序列。 递归参…

文件批量重命名:在原文件名上插入随机字母,高效命名文件的方法

在处理大量文件时&#xff0c;高效的文件命名系统可以大大提高工作效率。下面来看云炫文件管理器如何用简单的方法&#xff0c;轻松的在原文件名上批量插入随机字母&#xff0c;实现高效的文件命名。 原文件名插入随机字母前后的对比效果。 在原文件名上插入随机字母的操作&am…

时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价)

时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价) 目录 时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价)预测效果基本介绍程序设计参考资料 预测效果 …

spring-mvc数据绑定和表单标签库(介绍)

spring-mvc数据绑定和表单标签库 1. WEB-INF下页面跳转2. ModelAttribute来注解非请求处理方法3. 表单标签4. 其他标签5. IDEA tomcat控制台中文乱码问题处理 1. WEB-INF下页面跳转 容器启动后&#xff0c;如何默认显示web-inf目录下的系统首页。 2. ModelAttribute来注解非…

3D模型UV展开原理

今年早些时候&#xff0c;我为 MAKE 杂志写了一篇教程&#xff0c;介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理&#xff0c;并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub&#xff0c;但我在这里编写了对使这一…

linux驱动(四):platform

本文主要探讨x210驱动的平台设备类型(platform)以及misc设备。 驱动模型 设备驱动模型&#xff1a;总线(bus type)、设备(device)和驱动(driver) 总线&#xff1a;虚拟总线用于挂接驱动驱动和设备 总线、设备、驱动关系&#xff1a;/sys/bus下的子目录…

虚拟机Ubuntu网络配置

电脑有两个系统&#xff0c;windows系统和ubuntu系统&#xff0c;那网卡到底给哪一个用呢&#xff0c;所以要选择桥接模式&#xff0c;就可以共用网卡 但是我们电脑网卡&#xff0c;有线网卡&#xff0c;无线网卡&#xff0c;到底使用哪个网卡&#xff0c;所以选择桥接到自动或…

wxWidgets实战:使用mpWindow绘制阻抗曲线

选择模型时&#xff0c;需要查看model的谐振频率&#xff0c;因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示&#xff1a; mpWindow 左侧使用mpWindow&#xff0c;右侧使用什么&#xff1f; wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…

基于ssm的理财通的设计与实现+jsp论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对理财信息管理的提升&#xff0c…

长期使用外接键盘,外物压着自带键盘,容易导致华硕飞行堡垒FX53VD键盘全部失灵【除电源键】

华硕飞行堡垒FX53VD键盘全部失灵【除电源键】 前言一、故障排查二、发现问题三、使用方法总结 前言 版本型号&#xff1a; 型号 ASUS FX53VD&#xff08;华硕-飞行堡垒&#xff09; 板号&#xff1a;GL553VD 故障情况描述&#xff1a; 键盘无法使用&#xff0c;键盘除开机键外…

【题解】—— LeetCode一周小结1

1.经营摩天轮的最大利润 题目链接&#xff1a; 1599. 经营摩天轮的最大利润 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱&#xff0c;但每次轮转都需要支付一定的运行成本 runningCost 。摩…

使用kennycason.kumo.WordCloud For JAVA 制作词云图

官网&#xff1a;https://kennycason.com/posts/2014-07-03-kumo-wordcloud.html 一&#xff1a;添加POM文件 <!-- 词云 --><dependency><groupId>com.kennycason</groupId><artifactId>kumo-core</artifactId><version>1.27<…

c语言-字符串函数(库函数使用)和模拟实现

文章目录 前言一、库函数strcat()介绍1.1 strcat()介绍1.2 模拟实现strcat() 总结 前言 在写c语言基础系列文章时&#xff0c;介绍了字符串函数strlen(),strcpy(),strcmp()的使用和模拟实现。 本篇文章继续探讨其他字符串函数的使用以及模拟实现。 一、库函数strcat()介绍 1.…

螺旋数字矩阵 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m (0 < n <= 999,0 < m <= 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3……

RabbitMQ(十一)队列的扩展属性(Arguments)

目录 一、简介二、队列扩展属性清单三、代码示例3.1 实现方式一&#xff1a;channel.queueDeclare()3.2 实现方式二&#xff1a;QueueBuilder.build() 一、简介 RabbitMQ 允许用户在声明队列、交换机或绑定时设置 扩展属性&#xff08;Arguments&#xff09;&#xff0c;这些扩…

求阶乘(优化版)

✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&#xff0c;麻烦点点赞哦&#x1f388; 所属专栏&#xff1a;刷题 我的主页&#xff1a;脑子不好的小菜鸟 文章特点&#xff1a;关键点和步骤讲解放在 代码相应位置 明天考试&#xff0c;今天复习&#xff0c;复习…