Рассмотрим матрицу с N строками и M столбцами, где каждая ячейка содержит либо «0», либо «1», а любая ячейка, содержащая 1, называется заполненной ячейкой. Две ячейки называются связанными, если они примыкают друг к другу по горизонтали, вертикали или диагонали. Если одна или несколько заполненных ячеек соединены, они образуют область. Задача состоит в том, чтобы найти единицу площади самого большого региона.
Вот мой код:
class GFG {
static int max;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int t = 0; t < T; t++) {
max = 1;
int R = sc.nextInt();
int C = sc.nextInt();
int[][] M = new int[R][C];
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
M[i][j] = sc.nextInt();
}
}
printMatrix(M, R, C);
boolean[][] visited = new boolean[R][C];
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
int L = 1;
if (M[i][j] == 1 && !visited[i][j])
markVisited(M, visited, i, j, R, C, L);
}
}
System.out.println(max);
}
}
private static void printMatrix(int[][] M, int R, int C) {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
System.out.print(M[i][j] + " ");
}
System.out.println();
}
}
public static boolean isSafe(int[][] M, boolean[][] visited, int i, int j, int R, int C) {
return ((i >= 0 && i < R) && (j >= 0 && j < C) && (M[i][j] == 1 && (!visited[i][j])));
}
public static void markVisited(int[][] M, boolean[][] visited, int x, int y, int R, int C, int L) {
// int[] x_pos = {1 , 1, 1, 0, 0, -1, -1, -1};
// int[] y_pos = {-1, 0, 1, -1, 1, -1, 0, 1};
//commenting the arrays, as selecting one of the above and below combinations, result in different outputs
int[] x_pos = { -1, -1, -1, 0, 0, 1, 1, 1 };
int[] y_pos = { -1, 0, 1, -1, 1, -1, 0, 1 };
visited[x][y] = true;
for (int k = 0; k < 8; k++) {
if (isSafe(M, visited, x + x_pos[k], y + y_pos[k], R, C)) {
L++;
max = Math.max(L, max);
markVisited(M, visited, x + x_pos[k], y + y_pos[k], R, C, L);
}
}
}
}
Код не работает для указанного ниже тестового примера: 1 4 7 1 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 вывод 13, ожидаемый 14. Интересно, что если я изменю x_pos и y_pos (закомментированные в коде) в методе markVisited как
int[] x_pos = {1 , 1, 1, 0, 0, -1, -1, -1};
int[] y_pos = {-1, 0, 1, -1, 1, -1, 0, 1};
, вывод будет 14. Я не понимаю, как вывод может измениться, если комбинации x_pos и y_pos одинаковы.
Это происходит и для других тестовых случаев. Я прокомментировал x_pos [] и y_pos [].
Пожалуйста, предложите, что не так.