Algorithms/Breadth First Search

[BFS 알고리즘] 섬의 개수

잉숭 2021. 8. 1. 16:44

기출:  BOJ #4963

 

일반적인 BFS문제와 다른 점은 다음과 같다

 

1. 입력 종료 조건은 "0 0"의 입력이다

2. 같은 섬의 조건은 대각선을 포함한다

 

입력을 미리 받아 놓으려면 (입력의 개수가 정해지지 않은 경우)

sys.stdin.readline() 함수를 사용하면 된다

 

from sys import stdin

lines = stdin.readlines()

dx, dy = [1,1,1,0,0,-1,-1,-1], [1,0,-1,1,-1,1,0,-1]

while lines:
    y, x = map(int,lines.pop(0).split())
    if y==0 and x==0: break
    ans = 0
    visited = [[False for __ in range(y)] for _ in range(x)]
    board = list()
    for i in range(x):
        board.append(list(map(int,lines.pop(0).split())))
    for i in range(x):
        for j in range(y):
            if not visited[i][j] and board[i][j] == 1:
                # BFS
                visited[i][j] = True
                queue = [[i,j]]
                while queue:
                    cur = queue.pop(0)                                
                    for dir in range(8):
                        mx = cur[0] + dx[dir]
                        my = cur[1] + dy[dir]
                        if mx<0 or my<0 or mx>=x or my>=y: continue
                        if board[mx][my]==0: continue
                        if visited[mx][my]: continue
                        visited[mx][my] = True
                        queue.append([mx,my])
                ans += 1
    print(ans)