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

题目描述

小华和小为是很要好的朋友,他们约定周末一起吃饭。

通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能到达的聚餐地点有多少个?

输入描述

第一行输入 m 和 n

  • m 代表地图的长度
  • n 代表地图的宽度

第二行开始具体输入地图信息,地图信息包含:

  • 0 为通畅的道路
  • 1 为障碍物(且仅1为障碍物)
  • 2 为小华或者小为,地图中必定有且仅有2个 (非障碍物)
  • 3 为被选中的聚餐地点(非障碍物)

输出描述

可以被两方都到达的聚餐地点数量,行末无空格。

备注

地图的长宽为 m 和 n,其中:

  • 4 ≤ m ≤ 100
  • 4 ≤ n ≤ 100

聚餐的地点数量为 k,则

  • 1< k ≤ 100

用例

输入

4 4

2 1 0 3

0 1 2 1

0 3 0 0

0 0 0 0

输出

2

说明

第一行输入地图的长宽为4和4。

第二行开始为具体的地图,其中:3代表小华和小明选择的聚餐地点;2代表小华或者小明(确保有2个);0代表可以通行的位置;1代表不可以通行的位置。

此时两者能都能到达的聚餐位置有2处。

输入

4 4

2 1 2 3

0 1 0 0

0 1 0 0

0 1 0 0

输出

0

说明

第一行输入地图的长宽为4和4。

第二行开始为具体的地图,其中:3代表小华和小明选择的聚餐地点;2代表小华或者小明(确保有2个);0代表可以通行的位置;1代表不可以通行的位置。

由于图中小华和小为之间有个阻隔,此时,没有两人都能到达的聚餐地址,故而返回0。

题目解析

本题可以使用并查集解题。

小华和小为想去同一个餐厅,那么必然小华和小为和餐厅是可以连通,如果它们不能连通,则去不了同一个餐厅。

因此,我们可以遍历矩阵中每一个元素,将它和其上下左右元素进行连接,需要注意的是如果遍历的元素本身是1,或者其上下左右的元素是1,则不进行连接。

这样的话,遍历完矩阵后,就可以得到一个连通图。

同时在遍历矩阵过程中,记录小华、小为(值为2),以及餐厅(值为3)的位置,遍历结束后,首先看小华和小为是不是同一个祖先,若不是,则二者不可连通,就更别说去同一个餐厅了,因此返回0。若二者可以连通,则再看每一个餐厅的祖先是否和华为的祖先相同,若相同则计数++,这样就可以得到小华,小为去的同一个餐厅的数量了。

本题输入中

  • m 代表地图的长度
  • n 代表地图的宽度

长度 m 指的是地图矩阵的行数,宽度 n 指的是地图矩阵的列数。

import Foundation

func ODTest_2_42() {
    print("输入描述")
    print("第一行输入 m 和 n, m 代表地图的长度 n 代表地图的宽度")
    let MN = (readLine() ?? "").split(separator: " ").map { Int($0) ?? 0 }
    let M = MN[0], N = MN[1]

    print("第二行开始具体输入地图信息,地图信息包含:")
    // 矩阵
    print("第二行开始,是M行N列的像素的二维数组,仅包含像素1和5")
    var matrix = Array(repeating: Array(repeating: 0, count: N), count: M)
    for i in 0 ..< M {
        matrix[i] = (readLine() ?? "").split(separator: " ").map { Int($0) ?? 0 }
    }
    print("可以被两方都到达的聚餐地点数量,行末无空格。")
    // 记录小华,小为的位置
    var huawei: [Int] = []
    // 记录餐厅的位置
    var restaurants: [Int] = []

    let rows = matrix.count
    let cols = matrix[0].count
    let ufs = UnionFindSet(ro

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024华为OD机试卷题 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD 题目汇总。华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。

全部评论

相关推荐

1 3 评论
分享
牛客网
牛客企业服务