当前位置: 首页 > news >正文

欢乐的周末 - 华为OD统一考试(JavaScript 题解)

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

JavaScript

const rl = require('readline').createInterface({input: process.stdin,
});
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;// Author: code5bug
void (async function () {// 读取m和nlet firstLine = await readline();let [m, n] = firstLine.split(' ').map(Number);let g = []; // 网格let vis = []; // 访问标记数组// 初始化网格和访问数组for (let i = 0; i < m; i++) {let row = (await readline()).split(' ').map(Number);g.push(row);vis.push(new Array(n).fill(0));}// 查找起点位置(小华和小为的位置)let starts = [];for (let i = 0; i < m; i++) {for (let j = 0; j < n; j++) {if (g[i][j] === 2) {starts.push([i, j]);}}}// DFS函数function dfs(g, r, c, vis, seq) {// 边界检查:越界、障碍物或已访问if (r < 0 || c < 0 || r >= m || c >= n || g[r][c] === 1 || ((vis[r][c] >> seq) & 1) === 1) {return;}// 标记当前位置已被第seq个人访问vis[r][c] |= (1 << seq);// 四个方向DFSdfs(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);}// 分别从两个起点进行DFSfor (let i = 0; i < 2; i++) {let pos = starts[i];dfs(g, pos[0], pos[1], vis, i);}// 统计符合条件的聚餐地点let result = 0;for (let i = 0; i < m; i++) {for (let j = 0; j < n; j++) {// 是聚餐地点且两个人都访问过if (g[i][j] === 3 && vis[i][j] === 3) {result++;}}}console.log(result);rl.close();
})();

题目描述
在一个m×n的网格中,0表示空地,1表示障碍物,2表示起点(有两个人),3表示聚餐地点。两个人分别从各自的起点出发,只能上下左右移动,不能穿过障碍物。求两人都能到达的聚餐地点的数量。

解题思路

  1. 使用深度优先搜索(DFS)分别从两个人的起点出发,标记所有可以到达的位置。
  2. 使用位运算来记录访问状态:vis数组的每个元素是一个整数,其二进制位表示不同人是否访问过该位置。
  3. 最后遍历所有聚餐地点,统计同时被两个人访问过的地点数量。

关键点

  • 使用位运算高效记录访问状态(第0位表示第一个人,第1位表示第二个人)
  • DFS遍历所有可达位置
  • 障碍物和边界条件的处理

复杂度分析

  • 时间复杂度:O(m×n),因为每个网格最多被访问两次(两个人各一次)
  • 空间复杂度:O(m×n),用于存储网格和访问状态

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

http://www.dtcms.com/a/301296.html

相关文章:

  • RAG(检索增强生成)
  • Vue 四个map的使用方法
  • MySQL读写分离部署
  • 【YOLO系列】YOLOv1详解:模型结构、损失函数、训练方法及代码实现
  • 前端面试专栏-前沿技术:31.Serverless与云原生开发
  • Spring AI 项目实战(二十一):Spring Boot + AI +DeepSeek驱动的智能题库系统(附完整源码)
  • Linux-文件与文本管理
  • 【语义分割】记录2:yolo系列
  • Java面试实战:安全框架与大数据技术深度解析
  • 代码随想录算法训练营二十八天|动态规划part01
  • C语言自定义数据类型详解(四)——联合体
  • 欧拉图与欧拉回路
  • Windows---动态链接库Dynamic Link Library(.dll)
  • 裴蜀定理应用
  • Ubuntu Linux 如何配置虚拟内存 —— 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录8
  • GRPO强化学习缓解多模态大模型OCR任务的幻觉思路及数据生成思路
  • 【Oracle】Oracle分区表“排雷“指南:当ORA-14400错误找上门时如何优雅应对
  • 【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
  • 【Web安全】深入浅出理解“SQL注入-伪静态注入”及空格限制绕过技巧
  • linux 板卡实现vxi11服务
  • Qwen3安装使用教程:引领推理型大模型新时代
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-35,(知识点:三极管知识点,电路电压计算题,三极管电压计算,PNP三极管)
  • linux 部署 flink 1.15.1 并提交作业
  • 数据上新|最新省、地级市农业新质生产力2002-2025
  • Linux vimgrep 详解
  • 深度学习篇---优化器
  • 上位机知识篇---Tailwind CSS
  • Linux内核设计与实现 - 第15章 进程地址空间
  • python-列表推导式,迭代器和生成器,上下文管理器
  • Unity3D 平台宏定义