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

2024-01-10 14:12

本文主要是介绍欢乐的周末 - 华为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 位变为 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] & (1 << seq)) != 0: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] & (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 位变为 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;
}

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

这篇关于欢乐的周末 - 华为OD统一考试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591078

相关文章

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和