Skip to content

Commit 4d4c038

Browse files
committed
update shortest_distance from all buildings
1 parent 9679995 commit 4d4c038

3 files changed

Lines changed: 50 additions & 1 deletion

File tree

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import collections
2+
3+
## do BFS from each building, and decrement all empty place for every building visit
4+
## when grid[i][j] == -b_nums, it means that grid[i][j] are already visited from all b_nums
5+
## and use dist to record distances from b_nums
6+
7+
def shortest_distance(grid):
8+
"""
9+
:type grid: List[List[int]]
10+
:rtype: int
11+
"""
12+
m = len(grid)
13+
n = len(grid[0])
14+
if not m or not n:
15+
return -1
16+
17+
dist = [[0] * n] * m
18+
b_nums = 0
19+
for i in range(m):
20+
for j in range(n):
21+
if grid[i][j]==1: b_nums+=1
22+
b_idx = 0
23+
for i in range(m):
24+
for j in range(n):
25+
if grid[i][j]==1:
26+
bfs(grid, dist, i, j, b_idx)
27+
b_idx -= 1
28+
res = []
29+
for i in range(m):
30+
for j in range(n):
31+
if grid[i][j] + b_nums == 0:
32+
res.append(dist[i][j])
33+
return min(res) if res else -1
34+
35+
def bfs(grid, dist, i, j, b_idx):
36+
m = len(grid)
37+
n = len(grid[0])
38+
queue = collections.deque([(i, j, 0)])
39+
while queue:
40+
i, j, d = queue.popleft()
41+
for x,y in [(i+1, j), (i-1, j), (i, j-1), (i, j+1)]:
42+
if 0<=x<m and 0<=y<n and grid[x][y] == b_idx:
43+
dist[x][y] += d+1
44+
grid[x][y] -= 1
45+
queue.append((x, y, d+1))
46+
47+
48+
grid = [[1,0,2,0,1],[0,0,0,0,0],[0,0,1,0,0]]
49+
print(shortest_distance(grid))

string/word_squares.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ def build(square):
1717
build([word])
1818
return squares
1919

20-
dic = ["at","baba","atan","atal"]
20+
dic = ["atan","baba","atan","atal"]
2121
print(word_squares(dic))

0 commit comments

Comments
 (0)