1261번: 알고스팟
첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미
www.acmicpc.net
- 문제 분류에는 다익스트라라고 나와있는데... 미숙해서 그런지 감이 잘 오지 않는다.
- BFS 인데 우선순위 큐를 사용해서 최소거리 기준으로 뽑아내며 목적지에 도달하는 것이 좀 더 직관적이고 쉽다.
- 생각해보니 이러한 접근법 자체가 다익스트라인건가 싶기도 하고...
#include <iostream>
#include <queue>
using namespace std;
int N, M;
char miro[100][100];
bool visited[100][100];
int dir[4] = {1, -1, 0, 0};
priority_queue<pair<int, pair<int,int>>> hq;
int main(void)
{
cin >> M >> N;
for(int i = 0 ; i < N ; i++) for(int j = 0 ; j < M ; j++)
{
cin >> miro[i][j];
}
hq.push({0, {0, 0}});
while(hq.size())
{
int r = hq.top().second.first; // 가장 최소거리인 지점과 거리값을 뽑아내고
int c = hq.top().second.second;
int dist = -hq.top().first;
hq.pop();
if(r == N-1 && c == M-1) // 만약 목적지면 거리(부순 벽의 수) 출력하고 종료
{
cout << dist << endl;
return 0;
}
for(int i = 0 ; i < 4 ; i++) // 그게 아니라면 해당 위치에서 4방향 검사
{
int nr = r + dir[i];
int nc = c + dir[3-i]; // 인덱스 벗어나거나 이미 큐에 넣어놨던 지점이라면 스킵
if(nr < 0 || nr >= N || nc < 0 || nc >= M || visited[nr][nc]) continue;
visited[nr][nc] = true; // 처음 오는 곳이라면 방문 처리해주고
hq.push({-(dist + miro[nr][nc] - 48), {nr, nc}}); // 해당 위치의 거리를 큐에 넣어주고 반복
}
}
}
'PS > BOJ' 카테고리의 다른 글
[백준] 1699 : 제곱수의 합 (0) | 2021.01.15 |
---|---|
[백준] 11052 : 카드 구매하기 (0) | 2020.12.30 |
[백준] 1987.cpp : 알파벳 (0) | 2020.12.28 |
[백준] 1058.py : 친구 (0) | 2020.12.26 |
[백준] 1762 : 평면그래프와 삼각형 (0) | 2020.10.29 |