-
Notifications
You must be signed in to change notification settings - Fork 319
/
Copy path130_SurroundedRegions.py
executable file
·80 lines (72 loc) · 2.57 KB
/
130_SurroundedRegions.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
#! /usr/bin/env python
# -*- coding: utf-8 -*-
class Solution(object):
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
if not board:
return
m_rows = len(board)
n_cols = len(board[0])
if m_rows <= 2 or n_cols <= 2:
return
for row in range(m_rows):
board[row] = list(board[row])
# Search from the first and last row
for i in [0, m_rows-1]:
for j in range(n_cols):
if board[i][j] == "O":
self.breadth_first_search(i, j, board)
# Search from the first and last column
for j in [0, n_cols-1]:
for i in range(m_rows):
if board[i][j] == "O":
self.breadth_first_search(i, j, board)
# Make all the O surrounded by X to be X
for i in range(m_rows):
for j in range(n_cols):
if board[i][j] == "O":
board[i][j] = "X"
if board[i][j] == "#":
board[i][j] = "O"
board[i] = "".join(board[i])
"""
Mark all the Os can be arrived from outside row(column) to be '#'
And return one O node's adjacent O nodes
"""
def set_adjacency(self, row, col, board):
board[row][col] = "#"
adjacency_node = []
m_rows = len(board)
n_cols = len(board[0])
if row - 1 >= 0 and board[row-1][col] == "O":
board[row-1][col] = "#"
adjacency_node.append([row-1, col])
if row + 1 < m_rows and board[row+1][col] == "O":
board[row+1][col] = "#"
adjacency_node.append([row+1, col])
if col - 1 >= 0 and board[row][col-1] == "O":
board[row][col-1] = "#"
adjacency_node.append([row, col-1])
if col + 1 < n_cols and board[row][col+1] == "O":
board[row][col+1] = "#"
adjacency_node.append([row, col+1])
return adjacency_node
# Do BFS to every out border O ndoe.
def breadth_first_search(self, row, col, board):
adjacency_nodes = self.set_adjacency(row, col, board)
adjacency_record = []
while adjacency_nodes:
for node in adjacency_nodes:
adjacency_record.extend(
self.set_adjacency(node[0], node[1], board))
adjacency_nodes = adjacency_record
adjacency_record = []
"""
[]
["XXX", "XOX", "XXX"]
["OOX", "XOX", "OXX"]
["XXXX", "XOOX", "XXOX", "XOXX"]
"""