📜  门| Sudo GATE 2021的测验|问题28(1)

📅  最后修改于: 2023-12-03 14:58:34.640000             🧑  作者: Mango

Sudo GATE 2021 测试题-问题28

本题的主要目的是检查候选人在 Java 中的字符串和数组的概念方面的基础能力。问题是给定一个包含 n 个与门的线路图,您的任务是确定门是否可以被打开。

问题描述

你需要对给定的线路图进行处理,以判断给定的门是否可以打开。假设给出的线路图是二维数组,每个元素代表一扇门,其中“1”表示门是开的,而“0”表示门是关的。

例如,以下矩阵表示一个线路图:

1 0 0
1 1 1
0 1 1

在上面的线路图中,我们可以看到第一排中有一扇门是开的,第二排中有三扇门是开的,第三排中有两扇门是开的。

输入格式

输入的第一行包含一个整数 T,表示测试用例的数量。 每个测试用例描述如下:

  • 每个测试用例的第一行包含一个整数 n。
  • 接下来的n行每行包含n个空格分隔的整数 aij(0≤aij≤1),表示矩阵中第i行第j列位置的门的状态。
输出格式

对于每个测试用例,如果门可以被打开,则输出“YES”,否则输出“NO”。

样本输入
2
3
1 0 1
1 1 1
1 0 1
4
1 1 0 0
1 0 0 1
0 1 1 1
0 0 1 0
样本输出
YES
NO
解题思路

本题的主要是通过对二维数组的遍历,对每个元素进行判断是否满足开门的要求。对于每个门来说只有四个方向和相邻门才具有开门的可能性,所以我们只需要判断周围是否有开门就行。

Java 代码如下:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt(); // 测试用例的数量
        while (t-- > 0) {
            int n = sc.nextInt(); // 节点数
            int[][] graph = new int[n][n]; // 表示图的二维数组
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    graph[i][j] = sc.nextInt();
                }
            }
            if (canOpen(graph)) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
    }

    private static boolean canOpen(int[][] graph) {
        int n = graph.length; // 节点数
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (graph[i][j] == 1) {
                    if ((i > 0 && graph[i - 1][j] == 1) // 上方
                            || (j > 0 && graph[i][j - 1] == 1) // 左方
                            || (i < n - 1 && graph[i + 1][j] == 1) // 下方
                            || (j < n - 1 && graph[i][j + 1] == 1)) { // 右方
                        continue; // 表示该门满足开门的条件
                    } else {
                        return false; // 表示该门不满足开门的条件
                    }
                }
            }
        }
        return true; // 所有门都满足开门的条件
    }
}

时间复杂度:O(n^2),空间复杂度:O(n^2)。