给定一个 行 列的二维矩阵,矩阵中每个位置的数字取值为 或 ,矩阵示例如:
1 1 0 0
0 0 0 1
0 0 1 1
1 1 1 1
现需要将矩阵中所有的 进行反转为 ,规则如下:
第一行输入两个整数,分别表示矩阵的行数 和列数 ,取值范围均为
接下来 行表示矩阵的初始值,每行均为 个数,取值范围
输出一个整数,表示最少需要点击的次数
3 3
1 0 1
0 1 0
1 0 1
1
上述样例中,四个角上的 均在中间的 的相邻8个方向上,因此只需要点击一次即可。
4 4
1 1 0 0
0 0 0 1
0 0 1 1
1 1 1 1
2
在上述 的矩阵中,只需要点击2次,即可将所有的 进行消除。
import java.util.LinkedList;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Author: Amos
* E-mail: amos@amoscloud.com
* Date: 2022/11/28
* Time: 15:02
* Description:
*/
public class Main0167 {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
int n = scanner.nextInt();
int m = scanner.nextInt();
int[][] matrix = new int[n][m];
for (int x = 0; x < n; x++) {
for (int y = 0; y < m; y++) {
matrix[x][y] = scanner.nextInt();
}
}
solution(n, m, matrix);
}
}
// 8个方向
private static final int[][] directions = {
{-1, -1}, {0, -1}, {1, -1},
{-1, 0}, {1, 0},
{-1, 1}, {0, 1}, {1, 1}
};
private static void solution(int n, int m, int[][] matrix) {
int times = 0;
for (int x = 0; x < n; x++) {
for (int y = 0; y < m; y++) {
int cur = matrix[x][y];
if (cur == 1) {
times++;
LinkedList<int[]> changed = new LinkedList<>();
changed.add(new int[]{x, y});
change(n, m, matrix, changed);
}
}
}
System.out.println(times);
}
private static void change(int n, int m, int[][] matrix, LinkedList<int[]> changed) {
if (changed.isEmpty()) {
return;
}
int[] ints = changed.removeFirst();
for (int[] d : directions) {
int newX = ints[0] + d[0];
int newY = ints[1] + d[1];
if (newX >= 0 && newX < n &&
newY >= 0 && newY < m &&
matrix[newX][newY] == 1) {
matrix[newX][newY] = 0;
changed.add(new int[]{newX, newY});
}
}
change(n, m, matrix, changed);
}
}