알고리즘 풀이/백준
[백준 11967] 불켜기 - Python
12.tka
2021. 1. 26. 22:01
728x90
[사용한 알고리즘]
BFS(너비 우선 탐색)
[알고리즘]
1. (1, 1)을 시작점으로 BFS 탐색을 수행합니다.
2. 현재 위치에서 다른 위치의 불을 켤 수 있다면 불을 켭니다.
3. 현재 위치에서 상, 하, 좌, 우로 움직일 수 있는 공간이 있다면 움직입니다.
4. 위 과정을 더 이상 움직일 수 없을 때까지 반복합니다.
[코드]
from collections import deque
import sys
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs():
q = deque()
q.append((1, 1))
visited = {(1, 1)}
count = {(1, 1)}
switch[1][1] = True
while q:
x, y = q.popleft()
# 불을 켤 수 있는 스위치가 있는지 확인
if len(maps[x][y]) == 0:
pass
else:
for i in range(len(maps[x][y])):
switch[maps[x][y][i][0]][maps[x][y][i][1]] = True # 스위치 켜기
count.add((maps[x][y][i][0], maps[x][y][i][1]))
if (maps[x][y][i][0], maps[x][y][i][1]) not in visited:
for j in range(4):
nx, ny = maps[x][y][i][0] + dx[j], maps[x][y][i][1] + dy[j]
if 1 <= nx <= n and 1 <= ny <= n:
if (nx, ny) in visited:
q.append((nx, ny))
visited.add((nx, ny))
break
# 상, 하, 좌, 우 확인
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 1 <= nx <= n and 1 <= ny <= n:
if switch[nx][ny] and (nx, ny) not in visited:
visited.add((nx, ny))
q.append((nx, ny))
return len(count)
if __name__ == "__main__":
n, m = map(int, sys.stdin.readline().split())
maps = [[[] for _ in range(n + 1)] for _ in range(n + 1)]
switch = [[False] * (n + 1) for _ in range(n + 1)]
for _ in range(m):
x, y, a, b = map(int, sys.stdin.readline().split())
maps[x][y].append([a, b])
print(bfs())
728x90