공부하자!/알고리즘

백준 4963 섬의 개수 파이썬 - bfs

지우개원정대 2021. 9. 9. 12:11

문제

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

from collections import deque
import sys

dr = [-1, 1, 0, 0, -1, 1, -1, 1]
dc = [0, 0, -1, 1, -1, 1, 1, -1]


def bfs(x, y):
    queue.append((x, y))
    m[x][y] = cnt

    while queue:
        x, y = queue.popleft()
        for i in range(8):
            nx = x + dr[i]
            ny = y + dc[i]
            if 0 <= nx < h and 0 <= ny < w and m[nx][ny] == 1:
                m[nx][ny] = cnt
                queue.append((nx, ny))


while True:
    w, h = map(int, sys.stdin.readline().split())
    m = [[0] * w for i in range(h)]
    queue = deque()

    if w == h == 0:
        break
    for i in range(h):
        line = list(map(int, sys.stdin.readline().split()))
        for j in range(w):
            m[i][j] = line[j]

    cnt = 2
    for i in range(h):
        for j in range(w):
            if m[i][j] == 1:
                bfs(i, j)
                cnt += 1
    print(cnt-2)

대각선으로도 갈 수 있어서 8개 지정해줬고

cnt를 2로 설정해놓아서 1이랑 헷갈리지 않게 설정, 이후에 프린트 할 때는 2를 빼줬다