法1:DFS
想法:
1.遍历四周字母,遍历到"O",以该"O"为起点,进行DFS,与该"O"相连的"O"做上标记(包括该"O")。
2.将标记了的位置设值"O",其他位置为"X"。
3.做标记方式:将原"O"设为"T"。
/** * @param {character[][]} board * @return {void} Do not return anything, modify board in-place instead. */
var solve = function(board) {
if(board.length == 0) {
return [];
}
var i = 0, j = 0;
var row = board.length, column = board[0].length;
for(i = 0; i < column; i++) { // 遍历上边界
if(board[0][i] == 'X') {
continue;
}
else {
dfs(board, 0, i);
}
}
for(i = 0; i < row; i++) { // 遍历左边界
if(board[i][0] == 'X') {
continue;
}
else {
dfs(board, i, 0);
}
}
for(i = 0; i < column; i++) { // 遍历下边界
if(board[row - 1][i] == 'X') {
continue;
}
else {
dfs(board, row - 1, i);
}
}
for(i = 0; i < row; i++) { // 遍历右边界
if(board[i][column - 1] == 'X') {
continue;
}
else {
dfs(board, i, column - 1);
}
}
for(i = 0; i < row; i++) {
for(j = 0; j < column; j++) {
if(board[i][j] == 'T') {
board[i][j] = 'O';
}
else {
board[i][j] = 'X';
}
}
}
};
function dfs(board, r, c) {
if(r < 0 || r >= board.length || c < 0 || c >= board[0].length || board[r][c] != 'O') {
return 0;
}
board[r][c] = 'T';
var i = 0, j = 0;
// 遍历相邻节点
for(i = -1; i < 2; i++) {
for(j = -1; j < 2; j++) {
if(i == j || i * j == -1) {
continue;
}
dfs(board, r + i, c + j);
}
}
}
注:参考了答案