forked from y-ncao/Python-Study
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSurrounded_Regions.py
73 lines (67 loc) · 2.01 KB
/
Surrounded_Regions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
"""
Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.
A region is captured by flipping all 'O's into 'X's in that surrounded region.
For example,
```
X X X X
X O O X
X X O X
X O X X
```
After running your function, the board should be:
```
X X X X
X X X X
X X X X
X O X X
```
"""
class Solution:
# @param board, a 2D array
# Capture all regions by modifying the input board in-place.
# Do not return any value.
def solve(self, board):
if len(board) == 0 or len(board[0]) == 0: # This is sooooo keng
return board
M = len(board)
N = len(board[0])
for i in range(M):
for j in range(N):
if i == 0 or i == M-1 or j == 0 or j == N-1:
self.bfs(board, i, j)
for i in range(M):
for j in range(N):
if board[i][j] == 'V':
board[i][j] = 'O'
elif board[i][j] == 'O':
board[i][j] = 'X'
def bfs(self, board, row, col):
if (board[row][col] != 'O'):
return
q = []
q.append((row, col))
while len(q) > 0:
i, j = q.pop(0)
if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]):
continue
if board[i][j] != 'O':
continue
board[i][j] = 'V'
q.append((i-1, j))
q.append((i+1, j))
q.append((i, j-1))
q.append((i, j+1))
# DFS will cause stack overflow
def dfs(self, board, row, col):
if row < 0 or row >= len(board) or col < 0 or col >= len(board[0]):
return
if board[row][col] != 'O':
return
board[row][col] = 'V'
self.dfs(board, row+1, col)
self.dfs(board, row-1, col)
self.dfs(board, row, col+1)
self.dfs(board, row, col-1)
# Note:
# 1. For matrix/board problems, need to check if matrix/board == [], otherwise len(matrix[0]) will fail
# 2. DFS may cause stack overflow