![](https://img.haomeiwen.com/i14289546/5f543c1041ca0e8f.png)
解法
这个题原题是把被1包围的联通的0,全部改为1。当时没刷过这类题完全没经验,思路就是找四条边上为0的点,因为只有这些0联通的0才是不被包围的,记录下来打上标记,后面把其它0给改为1。
因为原题没有看到,这个X,O的题也可以类比为0,1,下面上具体的解法
public static void solve(char[][] board) {
// 边界判断,不然下面会越界
if (board.length < 3 || board[0].length < 3) {
return;
}
// 竖向边界列,只有边上为O,才不会被X包围
for (int i = 0; i < board.length; i++) {
dfs(board, i, 0);
dfs(board, i, board[0].length - 1);
}
// 横向边界行
for (int j = 1; j < board[0].length -1; j++) {
dfs(board, 0, j);
dfs(board, board.length - 1, j);
}
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
// 没有标记的O,改为X
if (board[i][j] == 'O') {
board[i][j] = 'X';
}
// 被标记的O,还原成O
if (board[i][j] == '*') {
board[i][j] = 'O';
}
}
}
}
private static void dfs(char[][] grid, int i, int j) {
if (i < 0 || i >= grid.length) {
return;
}
if (j < 0 || j >= grid[0].length) {
return;
}
// 不需要额外的是否访问过数组,这里为O就是没访问过
if (grid[i][j] == 'O') {
grid[i][j] = '*';
int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for (int[] dir : dirs) {
dfs(grid, i + dir[0], j + dir[1]);
}
}
}
网友评论