[BOJ] 4963번 섬의 개수 python

chowisely·2020년 8월 20일
0

BOJ

목록 보기
5/70

https://www.acmicpc.net/problem/4963

문제
정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.
한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.
두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.

input
1 1
0
2 2
0 1
1 0
3 2
1 1 1
1 1 1
5 4
1 0 1 0 0
1 0 0 0 0
1 0 1 0 1
1 0 0 1 0
5 4
1 1 1 0 1
1 0 1 0 1
1 0 1 0 1
1 0 1 1 1
5 5
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0

output
0
1
1
3
1
9

import sys

def bfs(arr, x, y, wh):
    q = [(x, y)]

    while len(q) != 0:
        s = q.pop(0)
        a = s[0]
        b = s[1]

        if a+1 < wh[0] and arr[a+1][b] and not visited[a+1][b]:
            visited[a+1][b] = True
            q.append((a+1, b))
        if a-1 > -1 and arr[a-1][b] and not visited[a-1][b]:
            visited[a-1][b] = True
            q.append((a-1, b))
        if b+1 < wh[1] and arr[a][b+1] and not visited[a][b+1]:
            visited[a][b+1] = True
            q.append((a, b+1))
        if b-1 > -1 and arr[a][b-1] and not visited[a][b-1]:
            visited[a][b-1] = True
            q.append((a, b-1))

        if a-1 > -1 and b-1 > -1 and arr[a-1][b-1] and not visited[a-1][b-1]:
            visited[a-1][b-1] = True
            q.append((a-1, b-1))
        if a+1 < wh[0] and b-1 > -1 and arr[a+1][b-1] and not visited[a+1][b-1]:
            visited[a+1][b-1] = True
            q.append((a+1, b-1))
        if a-1 > -1 and b+1 < wh[1] and arr[a-1][b+1] and not visited[a-1][b+1]:
            visited[a-1][b+1] = True
            q.append((a-1, b+1))
        if a+1 < wh[0] and b+1 < wh[1] and arr[a+1][b+1] and not visited[a+1][b+1]:
            visited[a+1][b+1] = True
            q.append((a+1, b+1))


input = sys.stdin.readline
wh = []
testcases = []
visited = [[False] * 50 for _ in range(50)]
answer = 0

while True:
    w, h = map(int, input().split())
    if w == 0 and h == 0:
        break
    wh.append((h, w))
    testcases.append([list(map(int, input().split())) for _ in range(h)])

for num in range(len(wh)):
    visited = [[False] * 50 for _ in range(50)]
    answer = 0
    for x in range(wh[num][0]):
        for y in range(wh[num][1]):
            if testcases[num][x][y] and not visited[x][y]:
                visited[x][y] = True
                bfs(testcases[num], x, y, wh[num])
                answer += 1
    print(answer)

0개의 댓글