You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
2.7 KiB

package class31;
public class Problem_0130_SurroundedRegions {
// // m -> 二维数组, 不是0就是1
// //
// public static void infect(int[][] m, int i, int j) {
// if (i < 0 || i == m.length || j < 0 || j == m[0].length || m[i][j] != 1) {
// return;
// }
// // m[i][j] == 1
// m[i][j] = 2;
// infect(m, i - 1, j);
// infect(m, i + 1, j);
// infect(m, i, j - 1);
// infect(m, i, j + 1);
// }
public static void solve1(char[][] board) {
boolean[] ans = new boolean[1];
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (board[i][j] == 'O') {
ans[0] = true;
can(board, i, j, ans);
board[i][j] = ans[0] ? 'T' : 'F';
}
}
}
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
char can = board[i][j];
if (can == 'T' || can == 'F') {
board[i][j] = '.';
change(board, i, j, can);
}
}
}
}
public static void can(char[][] board, int i, int j, boolean[] ans) {
if (i < 0 || i == board.length || j < 0 || j == board[0].length) {
ans[0] = false;
return;
}
if (board[i][j] == 'O') {
board[i][j] = '.';
can(board, i - 1, j, ans);
can(board, i + 1, j, ans);
can(board, i, j - 1, ans);
can(board, i, j + 1, ans);
}
}
public static void change(char[][] board, int i, int j, char can) {
if (i < 0 || i == board.length || j < 0 || j == board[0].length) {
return;
}
if (board[i][j] == '.') {
board[i][j] = can == 'T' ? 'X' : 'O';
change(board, i - 1, j, can);
change(board, i + 1, j, can);
change(board, i, j - 1, can);
change(board, i, j + 1, can);
}
}
// 从边界开始感染的方法,比第一种方法更好
public static void solve2(char[][] board) {
if (board == null || board.length == 0 || board[0] == null || board[0].length == 0) {
return;
}
int N = board.length;
int M = board[0].length;
for (int j = 0; j < M; j++) {
if (board[0][j] == 'O') {
free(board, 0, j);
}
if (board[N - 1][j] == 'O') {
free(board, N - 1, j);
}
}
for (int i = 1; i < N - 1; i++) {
if (board[i][0] == 'O') {
free(board, i, 0);
}
if (board[i][M - 1] == 'O') {
free(board, i, M - 1);
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j] == 'O') {
board[i][j] = 'X';
}
if (board[i][j] == 'F') {
board[i][j] = 'O';
}
}
}
}
public static void free(char[][] board, int i, int j) {
if (i < 0 || i == board.length || j < 0 || j == board[0].length || board[i][j] != 'O') {
return;
}
board[i][j] = 'F';
free(board, i + 1, j);
free(board, i - 1, j);
free(board, i, j + 1);
free(board, i, j - 1);
}
}