题目链接
思路
任何边界上的 ‘O’ 都不会被填充为 ‘X’. 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’.如果两个元素在水平或垂直方向相邻,则称它们是"相连"的.
只有不与边界上的 'O’相连的 ‘O’才会被填充成’X’;循环对边界的 'O’进行搜索;只要再边界的 'O’或者与边界 'O’相连的 ‘O’全部都置为’A’(也可以是其他的,无所谓);等到搜索完毕;再对数组进行循环;将元素为 'A’的还原成 ‘O’,将元素为 'O’的填充为 ‘X’.
java
int xLen, yLen;
public void solve(char[][] board) {
yLen = board[0].length;
for (int x = 0; x < xLen; x++) {
// 搜索竖列边界的'O'和与它相邻的'O'并置为'A'
dfs(x, 0, board);
dfs(x, yLen - 1, board);
}
for (int y = 1; y < yLen - 1; y++) {
// y=0和yLen-1再竖列查找时已经找过了,这里不再搜索
// 搜索横列边界的'O'和与它相邻的'O'并置为'A'
dfs(0, y, board);
dfs(xLen - 1, y, board);
}
// 遍历数组,将置为'A'的还原成'O'
// 将还是'O'的置为'X'
for (int x = 0; x < xLen; x++) {
for (int y = 0; y < yLen; y++) {
if (board[x][y] == 'A') {
board[x][y] = 'O';
continue;
}
if (board[x][y] == 'O') {
board[x][y] = 'X';
}
}
}
}
private void dfs(int x, int y, char[][] board) {
if (x < 0 || x >= xLen || y < 0 || y >= yLen || board[x][y] != 'O') {
return;
}
board[x][y] = 'A';
dfs(x - 1, y, board);
dfs(x + 1, y, board);
dfs(x, y - 1, board);
dfs(x, y + 1, board);
}
go
var xLen, yLen int
func solve(board [][]byte) {
xLen, yLen = len(board), len(board[0])
for x := 0; x < xLen; x++ {
// 搜索竖列边界的'O'和与它相邻的'O'并置为'A'
dfs(x, 0, &board)
dfs(x, yLen-1, &board)
}
for y := 1; y < yLen-1; y++ {
// y=0和yLen-1再竖列查找时已经找过了,这里不再搜索
// 搜索横列边界的'O'和与它相邻的'O'并置为'A'
dfs(0, y, &board)
dfs(xLen-1, y, &board)
}
// 遍历数组,将置为'A'的还原成'O'
// 将还是'O'的置为'X'
for x := range board {
for y := range board[x] {
if board[x][y] == 'A' {
board[x][y] = 'O'
continue
}
if board[x][y] == 'O' {
board[x][y] = 'X'
}
}
}
}
func dfs(x, y int, board *[][]byte) {
if x < 0 || x >= xLen || y < 0 || y >= yLen || (*board)[x][y] != 'O' {
return
}
(*board)[x][y] = 'A'
dfs(x-1, y, board)
dfs(x+1, y, board)
dfs(x, y-1, board)
dfs(x, y+1, board)
}