📜  门| GATE CS 2019 |问题 27(1)

📅  最后修改于: 2023-12-03 15:28:38.441000             🧑  作者: Mango

门 | GATE CS 2019 | 问题 27

这道题目是GATE CS 2019考试中的一道编程题,要求实现一个函数,判断一个矩阵是否是门(Gate)。

问题描述

一个矩阵被视为门,当且仅当:

  1. 矩阵的所有元素都是 0 或 1。
  2. 矩阵的第一行和最后一行都只有一个 1。
  3. 矩阵的第一列和最后一列都只有一个 1。
  4. 矩阵的剩余元素中,每个 1 都恰好有 4 个相邻的元素。

函数签名如下:

def is_gate(arr: List[List[int]]) -> bool:
    pass
解题思路

在判断一个矩阵是否为门时,我们需要先判断矩阵的前两行和后两行,以及前两列和后两列中是否只有一个 1。

接着,我们遍历矩阵中除去前两行/列和后两行/列的部分,每当遇到一个 1 时,就判断它周围是否有 4 个相邻的 1。

之所以只需要判断四个方向,是因为根据题目要求,每个 1 恰好有 4 个相邻的元素。

解题实现
from typing import List

def is_gate(arr: List[List[int]]) -> bool:
    # 判断前两行和后两行
    if arr[0].count(1) != 1 or arr[-1].count(1) != 1:
        return False
    
    # 判断前两列和后两列
    if not all([arr[i][0] == 1 and arr[i][-1] == 1 for i in range(len(arr))]):
        return False
    
    # 遍历除去前两行/列和后两列/列的部分
    for i in range(2, len(arr) - 2):
        for j in range(2, len(arr[0]) - 2):
            if arr[i][j] == 1:
                adjacent_ones = [arr[i-1][j], arr[i+1][j], arr[i][j-1], arr[i][j+1]]
                if adjacent_ones.count(1) != 4:
                    return False
    
    return True
复杂度分析

时间复杂度:$O(mn)$,其中 $m$ 表示矩阵的行数、$n$ 表示矩阵的列数。因为我们需要遍历除去前两行/列和后两行/列的部分。

空间复杂度:$O(1)$,因为我们没有使用额外的空间。