题目
解析
这道题目的关键在于反向思路。如果要去判断某个O所在的位置是不是被包围,挺困难的,所以反向去找那些没有被包围的所有O的位置,而题目里明确说了,在四条boundary上的O是不被包围的。这应该是最straight forward的方法了,不过从提交结果来看速度还是比较慢。具体流程如下:
- 从四条边界上找所有O的位置,这些O是最简单的可以确认是不被包围的点。那么进一步的就可以知道和这些O直接相连的点也肯定是不被包围的
- 从这些点出发,用dfs或者bfs找到所有和这些点直接相连的点,可以通过修改这些位置的mark,也可以直接记录位置,我这边采用的直接记录位置
- 遍历整个board,按照之前找到的位置做相应的修改
python代码如下:
class Solution:
def solve(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
def dfs(i,j):
if i<0 or i>=m or j<0 or j>=n or board[i][j]!='O' or (i,j) in visited:
return
pos.append((i,j))
visited.add((i,j))
dfs(i+1,j)
dfs(i-1,j)
dfs(i,j+1)
dfs(i,j-1)
if not len(board) or not len(board[0]):
return
visited = set()
pos = []
m = len(board)
n = len(board[0])
for i in range(m):
dfs(i,0)
dfs(i,n-1)
for i in range(n):
dfs(0,i)
dfs(m-1,i)
for i in range(m):
for j in range(n):
if board[i][j]=='O' and (i,j) not in pos:
board[i][j] = 'X'
C++版本如下:
class Solution {
public:
void solve(vector<vector<char>>& board) {
if