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

【大厂机试题解法笔记】可以组成网络的服务器

在一个机房中,服务器的位置标识在 n*m 的整数矩阵网格中,1 表示单元格上有服务器,0 表示没有。如果两台服务器位于同一行或者同一列中紧邻的位置,则认为它们之间可以组成一个局域网。
请你统计机房中最大的局域网包含的服务器个数。

输入描述
第一行输入两个正整数,n 和 m,0 < n, m <= 100
之后为 n * m 的二维数组,代表服务器信息

输出描述
最大局域网包含的服务器个数。

用例

输入:

2 2
1 0
1 1

输出:   

3

说明:

[0][0]、[1][0]、[1][1]三台服务器相互连接,可以组成局域网

思考

矩阵中相邻的1构成局域网,统计所有局域网中最大的。遍历矩阵,判断如果是 1 就 DFS 搜索周围的1,搜索过程中的统计 1 的数目,直到没有1或遇到矩阵边界时结束一轮 DFS,将本轮统计的局域网大小(1的数量)更新结果变量,取最大值。完成所有遍历和搜索,得到最大局域网数量。

算法过程

  1. 输入处理

    • 读取矩阵的行数 n 和列数 m
    • 逐行读取矩阵数据,存储为二维数组 mtx
  2. 初始化辅助结构

    • 创建与矩阵大小相同的 visited 数组,用于标记已访问的服务器
    • 初始化 maxCount 记录最大局域网服务器数量
  3. 深度优先搜索(DFS)

    • 终止条件:超出矩阵边界、当前位置无服务器或已访问
    • 标记当前服务器:将当前位置标记为已访问
    • 递归探索:向上下左右四个方向递归搜索相连的服务器
    • 返回值:当前局域网的服务器总数
  4. 遍历矩阵

    • 对每个位置 (i, j)
      • 若存在未访问的服务器(mtx[i][j] == 1 且未被访问)
      • 启动 DFS 计算当前局域网大小
      • 更新最大局域网大小 maxCount
  5. 遍历结束后,maxCount 即为最大局域网的服务器数量。时间复杂度为 O (n*m)。

参考代码

function solution() {const [n, m] = readline().split(' ').map(Number);const mtx = Array(n);for (let i = 0; i < n; i++) {mtx[i] = readline().split(" ").map(Number);}const visited = Array.from({length: n}, () => new Array(m).fill(false));let maxCount = 0;const dfs = function(x, y) {if (x < 0 || x >= n || y < 0 || y >= m || mtx[x][y] !==1 || visited[x][y]) {return 0;}visited[x][y] = true;let count = 1;count += dfs(x-1, y);count += dfs(x+1, y);count += dfs(x, y-1);count += dfs(x, y+1);return count;};for (let i = 0; i < n; i++) {for (let j = 0; j < m; j++) {if (mtx[i][j] === 1 && !visited[i][j]) {const count = dfs(i, j);maxCount = Math.max(maxCount, count);}}}console.log(maxCount);
}const cases = [`2 2
1 0
1 1`
];let caseIndex = 0;
let lineIndex = 0;const readline = (function () {let lines = [];return function () {if (lineIndex === 0) {lines = cases[caseIndex].trim().split("\n").map((line) => line.trim());}return lines[lineIndex++];};
})();cases.forEach((_, i) => {caseIndex = i;lineIndex = 0;solution();
});

http://www.xdnf.cn/news/14619.html

相关文章:

  • 使用亮数据网页抓取API自动获取Tiktok数据
  • Windows下安装zookeeper
  • 使用OpenCV实现中文字体渲染与特效处理
  • 单片机常用通信外设特点及通信方式对比表
  • 入门级STM32F103C8T6无人机遥控(原理图)
  • window显示驱动开发—支持 DXGI DDI(二)
  • 具身智能新突破:Gemini Robotics On-Device,让机器人拥有“本地大脑”
  • 【智能协同云图库】智能协同云图库第二弹:用户管理系统后端设计与接口开发
  • 开源流媒体平台安装使用
  • C# WinForm跨平台串口通讯实现
  • 2023年全国青少年信息素养大赛Python 复赛真题——玩石头游戏
  • 战地2042(战地风云)因安全启动(Secure Boot)无法启动的解决方案以及其他常见的启动或闪退问题
  • 自然语言处理入门
  • LT8311EX一款适用于笔记本电脑,扩展坞的usb2.0高速运转芯片,成对使用,延伸长度达120米
  • 第五课:大白话教你用K邻近算法做分类和回归
  • 用vscode破解最新typora1.10.8
  • 鸿蒙应用开发中的状态管理:深入解析AppStorage与LocalStorage
  • PYTHON从入门到实践2-环境配置与字符串打印用法
  • 【网络安全】从IP头部看网络通信:IPv4、IPv6与抓包工具 Wireshark 实战
  • vscode + Jlink 一键调试stm32 单片机程序(windows系统版)
  • ArkTS与仓颉开发语言:鸿蒙编程的双子星
  • 软件工程:从理论到实践,构建可靠软件的艺术与科学
  • 【4目方案】基于海思3403平台开发4目360°全景拼接相机方案
  • 五种 IO 模式的简单介绍 -- 阻塞 IO,非阻塞 IO,信号驱动 IO,IO 多路复用,异步 IO
  • RISC-V三级流水线项目:总体概述和取指模块
  • 基于java SSM的房屋租赁系统设计和实现
  • python基于微信小程序的广西文化传承系统
  • 【入门级-基础知识与编程环境:3、计算机网络与Internet的基本概念】
  • VLN论文复现——VLFM(ICRA最佳论文)
  • AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法(一)