-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path130 Surrounded Regions.py
81 lines (67 loc) · 2.16 KB
/
130 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
74
75
76
77
78
79
80
81
"""
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
Author: Rajeev Ranjan
"""
CONNECTED = 'C'
directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
class Solution:
def solve(self, board):
"""
Graph Theory
Algorithm1: bfs, to tell whether it is on the boarder
Algorithm2: bfs, to get the connectivity graph
:param board: a 2D array
:return: NIL, Capture all regions by modifying the input board in-place.
"""
if not board or not board[0]:
return
q = []
# scan the boarder
m = len(board)
n = len(board[0])
for i in xrange(m):
if board[i][0]=='O': q.append((i, 0))
if board[i][n-1]=='O': q.append((i, n-1))
for j in xrange(1, n-1):
if board[0][j]=='O': q.append((0, j))
if board[m-1][j]=='O': q.append((m-1, j))
while q: # dynamically expanding, no deletion of elements
cor = q.pop()
board[cor[0]][cor[1]]=CONNECTED # cannot be both "O" and CONNECTED
for direction in directions:
row = cor[0]+direction[0]
col = cor[1]+direction[1]
if 0<=row<m and 0<=col<n and board[row][col]=='O':
q.append((row, col))
for i in xrange(m):
for j in xrange(n):
if board[i][j]=='O':
board[i][j] = 'X'
elif board[i][j]==CONNECTED:
board[i][j] = 'O'
if __name__=="__main__":
board = [
['X', 'X', 'X', 'X'],
['X', 'O', 'O', 'X'],
['X', 'X', 'O', 'X'],
['X', 'O', 'X', 'X']
]
expected_board = [
['X', 'X', 'X', 'X'],
['X', 'X', 'X', 'X'],
['X', 'X', 'X', 'X'],
['X', 'O', 'X', 'X']
]
Solution().solve(board)
assert board==expected_board