• 华为OD机考算法题:服务器广播


    题目部分

    题目服务器广播
    难度
    题目说明服务器连接方式包括直接相连,间接连接。A 和 B 直接连接,B 和 C 直接连接,则 A 和 C 间接连接。直接连接和间接连接都可以发送广播。
    给出一个 N * N 数组,代表 N 个服务器,matrix[i][j] == 1,则代表 i 和 j 直接连接;不等于 1 时,代表 i 和 j 不直接连接。
    matrix[i][i] == 1,即自己和自己直接连接。matrix[i][j] == matrix[j][i]。
    计算初始需要给几台服务器广播,才可以使每个服务器都收到广播。
    输入描述输入描述输入为 N 行,每行有 N 个数字,为 0 或 1,由空格分隔,构成 N * N 的数组,N 的范围为 1 <= N <= 50。
    输出描述输出一个数字,为需要广播的服务器数量。
    补充说明补充说明
    ------------------------------------------------------
    示例
    示例1
    输入1 0 0
    0 1 0
    0 0 1
    输出3
    说明3 台服务器相互不连接,所以需要分别广播这 3 台服务器。
    示例2
    输入1 1 
    1 1
    输出1
    说明2 台服务器相互连接,所以只需要广播其中一台服务器。


    解读与分析

    题目解读

    在矩阵中,直接连接的服务器用 1 表示,不连接的用 0 表示,连接性是传递的。把相互连接的服务器放到同一个集合中,不连接的服务器在不同的集合中。求一共有多少个集合。

    分析与思路

    本题虽标记为“难”,实际很简单。

    逐一这个服务器,采用深度或广度遍历,逐一把遍历后连接的服务器放到同一个集合中。最后,集合的个数就是需要广播的服务器台数。


    代码实现

    Java代码

    1. import java.util.Scanner;
    2. import java.util.Set;
    3. import java.util.HashSet;
    4. import java.util.List;
    5. import java.util.ArrayList;
    6. /**
    7. * 服务器广播
    8. *
    9. * @since 2023.10.15
    10. * @version 0.1
    11. * @author Frank
    12. *
    13. */
    14. public class ServerBroadcastCount {
    15. public static void main(String[] args) {
    16. Scanner sc = new Scanner(System.in);
    17. while (sc.hasNext()) {
    18. String input = sc.nextLine();
    19. String[] strNumbers = input.split(" ");
    20. int count = strNumbers.length;
    21. int[][] numbers = new int[count][count];
    22. for (int i = 0; i < count; i++) {
    23. if (i != 0) {
    24. // 首行已读取
    25. input = sc.nextLine();
    26. strNumbers = input.split(" ");
    27. }
    28. int[] lineNum = new int[count];
    29. for (int j = 0; j < count; j++) {
    30. lineNum[j] = Integer.parseInt(strNumbers[j]);
    31. }
    32. numbers[i] = lineNum;
    33. }
    34. processServerBroadcastCount(numbers);
    35. }
    36. }
    37. private static void processServerBroadcastCount( int numbers[][] )
    38. {
    39. Set usedNumber = new HashSet();
    40. List> connectionList = new ArrayList>();
    41. for( int i = 0; i < numbers.length; i ++ )
    42. {
    43. if( usedNumber.contains( i ) )
    44. {
    45. continue;
    46. }
    47. Set newConnectionSet = new HashSet();
    48. usedNumber.add( i );
    49. newConnectionSet.add( i );
    50. initConnectionSet( i, usedNumber, newConnectionSet, numbers);
    51. connectionList.add(newConnectionSet );
    52. }
    53. System.out.println( connectionList.size() );
    54. }
    55. private static void initConnectionSet(int idx, Set usedNumber, Set newConnectionSet,
    56. int numbers[][]) {
    57. for( int i = 0; i < numbers.length; i ++ )
    58. {
    59. if( i == idx )
    60. {
    61. continue;
    62. }
    63. int idxCheck = numbers[idx][i];
    64. if( usedNumber.contains( i ) || idxCheck == 0 )
    65. {
    66. continue;
    67. }
    68. usedNumber.add( i );
    69. newConnectionSet.add( i );
    70. initConnectionSet( i, usedNumber, newConnectionSet, numbers);
    71. }
    72. }
    73. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. var strNumbers = line.split(" ");
    7. var count = strNumbers.length;
    8. var numbers = new Array();
    9. for (var i = 0; i < count; i++) {
    10. if (i != 0) {
    11. // 首行已读取
    12. line = await readline()
    13. strNumbers = line.split(" ");
    14. }
    15. var lineNum = new Array();
    16. for (var j = 0; j < count; j++) {
    17. lineNum[j] = parseInt(strNumbers[j]);
    18. }
    19. numbers[i] = lineNum;
    20. }
    21. processServerBroadcastCount(numbers);
    22. }
    23. }();
    24. function processServerBroadcastCount(numbers) {
    25. var usedNumber = new Set();
    26. var connectionList = new Array();
    27. for (var i = 0; i < numbers.length; i++) {
    28. if (usedNumber.has(i)) {
    29. continue;
    30. }
    31. var newConnectionSet = new Set();
    32. usedNumber.add(i);
    33. newConnectionSet.add(i);
    34. initConnectionSet(i, usedNumber, newConnectionSet, numbers);
    35. connectionList.push(newConnectionSet);
    36. }
    37. console.log(connectionList.length);
    38. }
    39. function initConnectionSet(idx, usedNumber, newConnectionSet,
    40. numbers) {
    41. for (var i = 0; i < numbers.length; i++) {
    42. if (i == idx) {
    43. continue;
    44. }
    45. var idxCheck = numbers[idx][i];
    46. if (usedNumber.has(i) || idxCheck == 0) {
    47. continue;
    48. }
    49. usedNumber.add(i);
    50. newConnectionSet.add(i);
    51. initConnectionSet(i, usedNumber, newConnectionSet, numbers);
    52. }
    53. }

    (完)

  • 相关阅读:
    高频Postman软件测试面试题
    JMeter问题及知识点记录(1)
    我有点想用JDK17了
    JAVA 链式编程和建造者模式的使用(lombok的使用)
    OKR 武器化:你的组织是否有此嫌疑?
    配置开启Docker2375远程连接与解决Docker未授权访问漏洞
    ELK介绍以及搭建
    1-5-10 快恢在数字化安全生产平台 DPS 中的设计与落地
    详解字符串格式化输出
    启动mysql 3.5时出现 MySql 服务正在启动 . MySql 服务无法启动。
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/133785370