BOJ 1261 알고스팟
https://www.acmicpc.net/problem/1261
시간 1초, 메모리 128MB
input :
- 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)
- 0은 빈 방을 의미하고, 1은 벽을 의미
- (1, 1)과 (N, M)은 항상 뚫려
output :
- 최소 몇 개 부수어야 하는지 출력
조건 :
- 어떤 방에서 이동할 수 있는 방은 상하좌우로 인접한 빈 방
bfs 문제 다익스트라인진 몰랐는데 그냥 품.. 벽을 최소한 깨야 하는 거니까 뭐 맞겠지..
새삼 해야하는 예외처린 별로 없다.
맨날 continue 걸어줄 때
nx > n, ny > m 이라고 해서 에러가 난다.
= 까지 포함해 주어야 그래프 밖으로 나가는 것을 막을 수 있다.
함수의 동작은 다음 이동하려는 지점에 벽이 존재하는지, 안 하는지.
그 지점을 이미 간적이 없거나
visit[x][y] + 1 이번에 벽이 존재해서 뚫은 횟수를 더한것이
visit[nx][ny]의 값보다 작다면 q에 append 해주자.
벽이 없을 때에도 위의 방법을 반복하자.
import sys
from _collections import deque
m, n = map(int, sys.stdin.readline().split())
graph = []
for i in range(n):
graph.append(list(map(int, sys.stdin.readline().strip())))
visit = [[99999] * m for i in range(n)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs():
q = deque([])
q.append((0, 0))
visit[0][0] = 0
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx >= n or nx < 0 or ny >= m or ny < 0:
continue
# 다음 이동하는 곳에 벽이 존재.
if graph[nx][ny] == 1:
if visit[nx][ny] == 99999 or visit[nx][ny] > visit[x][y] + 1:
visit[nx][ny] = visit[x][y] + 1
q.append((nx, ny))
else:
if visit[nx][ny] == 99999 or visit[nx][ny] > visit[x][y]:
visit[nx][ny] = min(visit[nx][ny], visit[x][y])
q. append((nx, ny))
bfs()
print(visit[n - 1][m - 1])
Author And Source
이 문제에 관하여(BOJ 1261 알고스팟), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jsin2475/BOJ-1261-알고스팟저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)