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

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 位变为 1vis[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 位变为 1vis[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 位变为 1vector<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.hqwc.cn/news/451584.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1 月 30 日算法练习-数论

唯一分解定理 唯一分解定理指的是&#xff1a;对于任意一个>1的正整数&#xff0c;都可以以唯一的一种方式分解为若干质因数的乘积。 x p 1 k 1 ⋅ p 2 k 2 ⋅ … ⋅ p m k m x p_1^{k_1} \cdot p_2^{k_2} \cdot \ldots \cdot p_m^{k_m} xp1k1​​⋅p2k2​​⋅…⋅pmkm​…

成都爱尔林江院长解读儿童青少年为什么一定要进行医学验光配镜

根据国家卫健委数据显示&#xff1a;我国青少年儿童总体近视率为52.7%、高度近视人口超3000万。近视学生中,有10%为高度近视,且占比随年级升高而增长。 近视孩子之多&#xff0c;孩子视力发展备受关注。戴镜进行近视防控十分必要&#xff0c;且眼镜不可随意验配&#xff01; 成…

B.关鸡-牛客寒假训练营(一)

https://ac.nowcoder.com/acm/contest/67741/B 本题使用set<pair<int,int>>st来存放数据可以做到高效查找 考虑以下两种情况 情况一、火鸡左右分别被包围最多4堆火 或者上下两堆火间距不超过1 情况二、火鸡左右下被包住,最多3堆火 还有一种特殊情况,一侧被包…

PyTorch——初识PyTorch框架

本文主要介绍PyTorch的基础知识&#xff0c;PyTorch的优点&#xff0c;案例&#xff0c;PyTorch和Tensorflow的对比&#xff0c;让我们对PyTorch的框架有一个基本的了解。 1.1 为什么要选择学习PyTorch&#xff08;PyTorch的优点&#xff09;&#xff1f; 活跃度&#xff1a;逐…

APK签名 v1、 v2、v3、v3.1、v4 解析

在 Android 应用签名中&#xff0c;V1 V2 V3 V4签名是不同的签名方案&#xff0c;具体描述如下&#xff1a; V1 签名&#xff08;JAR 签名&#xff09;&#xff1a;早期 Android 应用签名的基本形式&#xff0c;基于 Java 签名&#xff08;JAR 签名&#xff09;规范。它将应用…

simulink产生PWM波-PWM Generator模块使用

一、什么是PWM 脉冲宽度调制&#xff08;PWM&#xff09;&#xff0c;简称脉宽调制&#xff0c;系指借助微处理器数字输出对模拟电路实施控制的一种高效方法&#xff0c;其在从测量、通信至功率控制与转换等多个领域具有广泛应用。 二、PWM的参数 PWM的频率与周期 PWM的频率…

免费ai绘画软件选择哪个?

对于免费AI绘画软件的选择&#xff0c;因为每个软件都有其独特的优点和适用场景&#xff0c;可以根据个人的需求和技能水平来决定。以下是被广泛认可的AI绘画软件&#xff1a; 1、建e网AI-一款为建筑室内设计师提供AI绘图的智能工具&#xff0c;具有文字生图&#xff0c;方案优…

【Linux】Ext2 文件系统

文件系统 前言一、磁盘硬件1. 磁盘的物理存储结构2. 磁盘存储的逻辑抽象结构 二、理解 Ext2 文件系统1. 初步理解文件系统2. 深入理解文件系统&#xff08;1&#xff09;inode Table&#xff08;2&#xff09;Data blocks&#xff08;3&#xff09;inode Bitmap&#xff08;4&a…

网络规划与部署实训

一 实训目的及意义 本周实训主要是了解网络规划与部署&#xff0c;熟悉三大厂商华为、思科、锐捷交换机路由器以及相关协议的原理和配置&#xff0c;提高学生的动手能力和分析规划部署能力。 实训主要针对计算机网络系统集成的设计与实现的实际训练&#xff0c;着重锻炼学生熟练…

OJ刷题:《剑指offer》之单身狗1、2 !(巧用位操作符,超详细讲解!)

目录 1.单身狗1 1.1 题目描述 1.2排序寻找 1.3巧用位操作符 2.单身狗2 1.1 题目描述 1.2排序寻找 1.3巧用位操作符 不是每个人都能做自己想做的事&#xff0c;成为自己想成为的人。 克心守己&#xff0c;律己则安&#xff01; 创作不易&#xff0c;宝子们&#xff01;如…

BAPI_ACC_DOCUMENT_POST的extension2扩展结构

目录 BAPI_ACC_DOCUMENT_POST的extension2扩展结构扩展结构的创建扩展结构的使用完整代码 BAPI_ACC_DOCUMENT_POST的extension2扩展结构 扩展结构的创建 扩展结构的使用 完整代码 *&---------------------------------------------------------------------* *& Repo…

ChatLaw:基于LLaMA微调的法律大模型

文章目录 动机数据组成模型框架模型评估 北大团队发布首个的中文法律大模型落地产品ChatLaw&#xff0c;为大众提供普惠法律服务。模型支持文件、语音输出&#xff0c;同时支持法律文书写作、法律建议、法律援助推荐。 github地址&#xff1a;https://github.com/PKU-YuanGroup…