小华和小为的聚餐地点 - 华为OD统一考试

news2024/11/14 10:29:05

OD统一考试(C卷)

分值: 200分

题解: 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,表示这个位置被访问过。

最后,遍历所有聚餐地点,如果两个人都能到达的地点,就将结果加 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] >> seq) & 1) == 1) {
            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] >> seq) & 1 ) == 1:
        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] >> seq) & 1)) 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;
}

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

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

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

相关文章

支付宝直连商户处理支付交易投诉管理,支持多商户

大家好&#xff0c;我是小悟 1、问题背景 玩过支付宝生态的&#xff0c;或许就有这种感受&#xff0c;如果收到投诉单&#xff0c;不会通知到手机端&#xff0c;只会在支付宝商家后台-账号中心-安全中心-消费者投诉-支付交易投诉那里显示。那你能一直盯着电脑看吗&#xff1f;…

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测 目录 多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序…

梳理cuda算子编译与python调用的流程_以vllm为例

最近在使用vllm框架,部署大语言模型的时候。发现吞吐量提升比较明显。对里面用到的技术比较感兴趣。后来发现vllm使用了一些新的技术,如kv cache,page attention等。其中很多是用cuda编写加速的。并且对cuda算子如何应用到python服务中比较感兴趣,现在就自己的了解,用文章…

如何进行嵌入式系统的软件性能监测和优化

嵌入式系统的软件性能监测和优化是确保系统能够高效运行和性能稳定的关键步骤。嵌入式系统通常包含有限的计算资源和受限的能源消耗&#xff0c;因此对其进行有效的性能监测和优化是至关重要的。本文将介绍嵌入式系统软件性能监测和优化的基本概念、常见方法和技术&#xff0c;…

SQL报错注入

SQL注入报错注入 报错注入原理:报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的在遇到有报错回显的时候&#xff0c;但是没有数据回显的情况下可以利用报错注入的函数: 1.floor():向下取整 2.extractvalue(): 对XML文档进行查询的函数&#xff0c;当参数的格式…

代码随想录算法训练营第42天 | 01背包问题,你该了解这些! 01背包问题,你该了解这些! 滚动数组 416. 分割等和子集

目录 01背包问题&#xff0c;你该了解这些&#xff01; 01 背包 二维dp数组01背包 &#x1f4bb;实现代码 01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 一维dp数组&#xff08;滚动数组&#xff09; &#x1f4bb;实现代码 416. 分割等和子集 &#x1f…

位运算之妙用:识别独特数字(寻找单身狗)

目录 找单身狗1 图解&#xff1a; 代码如下&#xff1a; 找单身狗2 图解&#xff1a; 代码如下&#xff1a; 寻找单身狗1 从数组中 的1 2 3 4 5 1 2 3 4 中找出没有另一个相同的数与其匹配的数 这个问题的原理是利用异或运算的性质。异或运算&#xff08;XOR&#xff09…

游戏如何选择服务器

一个网络游戏要想长期运行下去&#xff0c;关键是用户体验&#xff0c;在初期阶段的游戏服务器租用环节就显得尤为重要。那么问题来了&#xff0c;游戏公司如何才能够在众多的服务器商中租用找到高性能、高性价比的游戏服务器租用呢&#xff1f;租用游戏服务器时需要考虑的因素…

vite, vue3, vue-router, vuex, ES6学习日记

学习使用vitevue3的所遇问题总结&#xff08;2024年2月1日&#xff09; 组件中使用<script>标签忘记加 setup 这会导致Navbar 没有暴露出来&#xff0c;导致使用不了&#xff0c;出现以下报错 这是因为&#xff0c;如果不用setup&#xff0c;就得使用 export default…

Leetcode—2881. 创建新列【简单】

2024每日刷题&#xff08;一零九&#xff09; Leetcode—2881. 创建新列 实现代码 import pandas as pddef createBonusColumn(employees: pd.DataFrame) -> pd.DataFrame:employees[bonus] employees[salary] * 2return employees 运行结果 之后我会持续更新&#xf…

Deepin如何开启与配置SSH实现无公网ip远程连接

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

leetcode刷题(剑指offer)113.路径总和Ⅱ

113.路径总和Ⅱ 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], tar…

解锁教育系统源码的定制奥秘:企业培训平台开发详解

今天&#xff0c;小编将为大家讲解教育系统源码的奥秘&#xff0c;详细解释企业培训定制开发的关键步骤和技术要点。 一、需求分析与设计阶段 设计阶段则包括系统的整体架构设计、数据库设计以及用户界面设计等方面。 二、技术选型与开发环境搭建 通过使用版本控制系统、集成…

解决WARNING: IPv4 forwarding is disabled. Networking will not work的具体操作步骤

IPv4转发禁用警告&#xff1a;网络无法正常工作 在使用网络连接的过程中&#xff0c;我们可能遇到警告消息“WARNING: IPv4 forwarding is disabled. Networking will not work”&#xff08;警告&#xff1a;IPv4转发已禁用&#xff0c;网络将无法正常工作&#xff09;。这个…

2024美赛E题数学建模思路代码数据分享

2024 ICM Problem E: Sustainability of Property Insurance 本题要求选取不同大陆上经历极端天气的两个地区来为保险公司开发模型&#xff0c;本题的重点是找到尽可能多而全的数据&#xff0c;包括天气数据&#xff0c;经济数据&#xff0c;人口数据等。 模型选择&#xff1a…

【Python】【完整代码】解析Excel文件内容,按每列首行元素名打印出某个字符串的统计占比(超详细)

目录 1.示例&#xff1a; 1.1 实现代码1&#xff1a;列数为常量 运行结果&#xff1a; 1.2 实现代码2&#xff1a;列数为变量 运行结果&#xff1a; 1.示例&#xff1a; 开发需求&#xff1a;读取Excel文件&#xff0c;统计第3列到第5列中每列的"False"字段占…

C语言——P/文件操作

一、为什么使用文件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久…

数据结构—基础知识:哈夫曼树

文章目录 数据结构—基础知识&#xff1a;哈夫曼树哈夫曼树的基本概念哈夫曼树的构造算法哈夫曼树的构造过程哈夫曼算法的实现算法&#xff1a;构造哈夫曼树 数据结构—基础知识&#xff1a;哈夫曼树 哈夫曼树的基本概念 哈夫曼&#xff08;Huffman&#xff09;树又称最优树&…

gtest测试框架

文章目录 前言1 单元测试2 gtest安装3 gtest原理4 断言4.1 明确指定或失败4.2 布尔条件4.3 二元比较4.4 谓词断言4.5 死亡测试5 gtest使用5.1 测试函数5.2 测试类5.3 测试夹具5.4 类型参数化5.5 事件总结前言 GoogleTest(GTest) 是谷歌开源的 C++ 单元测试框架。 1 单元测试…

redis存储对象的过期设置在实际项目中的运用案例展示

redis存储对象的过期设置在实际项目中的运用案例展示&#xff01;经过前面的学习&#xff0c;我们已经基本上初步掌握了redis数据库存储对象的过期时间是如何设置的了。下面给大家展示一个具体的实际开发项目中用到业务场景。 在项目化生寺小程序游戏开发中&#xff0c;有道具&…