forked from csujedihy/lc-all-solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsurrounded-regions.py
64 lines (57 loc) · 2.16 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
class UnionFind():
def __init__(self, m, n):
self.dad = [i for i in xrange(0, m*n)]
self.rank = [0 for i in xrange(0, m*n)]
self.m = m
self.n = n
def find(self, x):
dad = self.dad
if dad[x] != x:
dad[x] = self.find(dad[x])
return dad[x]
def union(self, xy):
dad = self.dad
rank = self.rank
x, y = map(self.find, xy)
if x == y:
return False
if rank[x] > rank[y]:
dad[y] = x
else:
dad[x] = y
if rank[x] == rank[y]:
rank[y] += 1
return True
class Solution:
# @param {list[list[str]]} board a 2D board containing 'X' and 'O'
# @return nothing
def solve(self, board):
# Write your code here
if len(board) == 0:
return
regions = set([])
n, m = len(board), len(board[0])
uf = UnionFind(len(board[0]), len(board))
directions = {"u": (-1, 0), "d": (1, 0), "l": (0, -1), "r": (0, 1)}
for i in xrange(0, len(board)):
for j in xrange(0, len(board[0])):
if board[i][j] == 'X':
continue
for d in ["d", "r"]:
di, dj = directions[d]
newi, newj = i + di, j + dj
if newi >= 0 and newi < len(board) and newj >= 0 and newj < len(board[0]):
if board[newi][newj] == "O":
uf.union((newi*m + newj, i*m + j))
for i in xrange(0, len(board)):
for j in [0, len(board[0]) - 1]:
if board[i][j] == "O":
regions.add(uf.find(i*m + j))
for j in xrange(0, len(board[0])):
for i in [0, len(board) - 1]:
if board[i][j] == "O":
regions.add(uf.find(i*m + j))
for i in xrange(0, len(board)):
for j in xrange(0, len(board[0])):
if board[i][j] == "O" and uf.find(i*m + j) not in regions:
board[i][j] = "X"