📅  最后修改于: 2023-12-03 14:58:34.640000             🧑  作者: Mango
本题的主要目的是检查候选人在 Java 中的字符串和数组的概念方面的基础能力。问题是给定一个包含 n 个与门的线路图,您的任务是确定门是否可以被打开。
你需要对给定的线路图进行处理,以判断给定的门是否可以打开。假设给出的线路图是二维数组,每个元素代表一扇门,其中“1”表示门是开的,而“0”表示门是关的。
例如,以下矩阵表示一个线路图:
1 0 0
1 1 1
0 1 1
在上面的线路图中,我们可以看到第一排中有一扇门是开的,第二排中有三扇门是开的,第三排中有两扇门是开的。
输入的第一行包含一个整数 T,表示测试用例的数量。 每个测试用例描述如下:
对于每个测试用例,如果门可以被打开,则输出“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)。