Advertisement
Guest User

Find the Number of Islands (not mutating argument)

a guest
Jan 6th, 2022
400
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.43 KB | None | 0 0
  1. from typing import List
  2.  
  3. from collections import deque
  4. def count_number_of_islands(grid: List[List[int]]) -> int:
  5.     M, N = len(grid), len(grid[0])
  6.     def get_neighbors(r, c):
  7.         offsets = [(-1, 0), (0, -1), (0, +1), (+1, 0)]  # NWES
  8.         return [(r+o[0], c+o[1]) for o in offsets
  9.                 if (0 <= r+o[0] and r+o[0] < M) and (0 <= c+o[1] and c+o[1] < N)
  10.                 and grid[r+o[0]][c+o[1]]]
  11.     def bfs(r, c, visited, islands):  # visit adjacent 1s starting at (r,c)
  12.         queue, island = deque([(r, c)]), []
  13.         while len(queue):
  14.             c_r, c_c = queue.popleft()  # cell coord
  15.             island.append((c_r, c_c))
  16.             neighbors = get_neighbors(c_r, c_c)
  17.             [queue.append(n) for n in neighbors if n not in visited]
  18.             [visited.add(n) for n in neighbors]
  19.         islands.append(island)
  20.     visited, islands = set(), [] # matrix also works for visited
  21.     for r in range(M):
  22.         for c in range(N):
  23.             if (r, c) in visited:  # skip previously discovered island
  24.                 continue
  25.             elif grid[r][c] == 1:  # new island, mark adjacent 1s visited
  26.                 bfs(r, c, visited, islands)
  27.             else:  # 0, mark visited
  28.                 visited.add((r, c))
  29.     return len(islands)
  30.  
  31. if __name__ == '__main__':
  32.     grid = [[int(x) for x in input().split()] for _ in range(int(input()))]
  33.     res = count_number_of_islands(grid)
  34.     print(res)
  35.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement