300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 코딩테스트
- OS
- 그래프
- 알고리즘
- 파이썬
- 동적 프로그래밍
- dp
- kick start
- 딥러닝
- 킥스타트
- DFS
- 백준
- 브루트포스
- 순열
- google coding competition
- 프로그래밍
- CSS
- AI
- 리눅스
- nlp
- 동적프로그래밍
- 코딩 테스트
- 운영체제
- linux
- 네트워크
- BFS
- PYTHON
- 코딩
- 구글 킥스타트
- 프로그래머스
Archives
- Today
- Total
오뚝이개발자
[백준2178] 미로 탐색 본문
728x90
300x250
문제
https://www.acmicpc.net/problem/2178
생각의 흐름
이전에 포스팅했던 알고스팟과 유사한 문제이다. 차이점은 2가지이다.
- 시작점과 끝점의 칸 수를 포함하여 계산한다는 점
- 알고스팟의 경우 칸의 수가 1인 경우와 0인 경우 모두 이동이 가능했지만 본 문제의 경우 1인 경우에만 이동이 가능하다는 점
코드
from queue import PriorityQueue as pq
def dijkstra():
heap = pq()
heap.put((1, (0, 0)))
crush[0][0] = 0
# 상하좌우
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
while True:
cnt, (hi, hj) = heap.get()
# print(cnt, hi, hj)
if hi == n-1 and hj == m-1:
break
for d in range(4):
x, y = hi + dx[d], hj + dy[d]
if 0<=x<n and 0<=y<m and crush[x][y]<0:
# crush[x][y] = (x,y)전까지 부순 벽의 갯수
crush[x][y] = cnt
if maze[x][y] == '1':
# heap의 원소의 cnt = (x,y)에서 부순 벽의 갯수도 포함
heap.put((cnt+1, (x, y)))
n, m = map(int, input().split())
maze = [list(input()) for _ in range(n)]
crush = [[-1] * m for _ in range(n)]
dijkstra()
print(crush[n-1][m-1]+1)
728x90
300x250
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준7576] 토마토 (0) | 2020.03.30 |
---|---|
[백준14226] 이모티콘 (0) | 2020.03.23 |
[백준2667] 단지번호붙이기 (0) | 2020.03.20 |
[백준1261] 알고스팟 (0) | 2020.03.18 |
[백준11724] 연결 요소의 개수 (0) | 2020.03.15 |
Comments