Algorithm(CodeTree, Python)/BFS

[코드트리] 갈 수 있는 곳들 Python

kurooru 2023. 2. 28. 17:56
# n, m 입력
n, m = map(int, input().split())

# grid 입력
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]

# start_points
start_points = [
    tuple(map(int, input().split()))
    for _ in range(m)
]

# in_range(x, y)
def in_range(x, y):
    return 0 <= x < n and 0 <= y < n

# can_go(x, y)
def can_go(x, y):
    # 범위 내에 있고, 방문한 적 없으며, 0이면 가능
    return in_range(x, y) and not visited[x][y] and not grid[x][y]

# bfs()
def bfs():
    # 전역 변수 선언
    global cnt

    while q:
        x, y = q.popleft()
        dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
        for dx, dy in zip(dxs, dys):
            nx, ny = x + dx, y + dy
            # 갈 수 있으면
            if can_go(nx, ny):
                # cnt 올려주고
                cnt += 1
                # 큐에 넣어주고
                q.append((nx, ny))
                # 방문 처리
                visited[nx][ny] = True
                
# 설계
# visited
visited = [
    [False] * n
    for _ in range(n)
]

# 큐 사용준비
from collections import deque
q = deque()

# cnt
cnt = 0

# start_points를 돌면서
for point in start_points:
    
    # unpacking
    x, y = point
    x -= 1
    y -= 1

    # 방문하지 않은 점이면
    if not visited[x][y]:
        # cnt 올려주고
        cnt += 1
        # 큐에 넣어주고
        q.append((x, y))
        # 방문 처리 후
        visited[x][y] = True
        # bfs
        bfs()

# 출력
print(cnt)