[적용한 알고리즘]
다익스트라
[아이디어]
https://akim9905.tistory.com/45 와 똑같다. 벽이 cost가 되는거다.
[생각의 흐름 / 절차]
내용
[교훈]
n, m으로 장난쳐놨다. 찾는데 한참 걸림. 조심들 하세요.
<코드>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int MAX = 101;
const int INF = 1000000000;
int dirx[] = {-1, 1, 0, 0};
int diry[] = {0, 0 ,1, -1};
int n, m;
struct Ver{
int x, y, dist;
bool operator < (const Ver &v) const{
return dist > v.dist;
}
};
bool inMap(int x, int y){
if (1 <= x && x <= n && 1 <= y && y <= m) return true;
return false;
}
int main(){
bool visited[MAX][MAX] = { 0 };
int map[MAX][MAX] = { 0 };
int dist[MAX][MAX] = { 0 };
scanf("%d %d", &m, &n);
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
scanf("%1d", &map[i][j]);
dist[i][j] = INF;
}
}
dist[1][1] = 0;
priority_queue<Ver> PQ;
PQ.push({1, 1, dist[1][1]});
while (!PQ.empty()) {
Ver cur;
do {
cur = PQ.top();
PQ.pop();
} while (!PQ.empty() && visited[cur.x][cur.y]);
if (visited[cur.x][cur.y]) break;
visited[cur.x][cur.y] = true;
for (int k = 0; k < 4; k++) {
int nx = cur.x + dirx[k];
int ny = cur.y + diry[k];
if (inMap(nx, ny)) {
if (dist[nx][ny] > dist[cur.x][cur.y] + map[nx][ny]) {
dist[nx][ny] = dist[cur.x][cur.y] + map[nx][ny];
PQ.push({nx, ny, dist[nx][ny]});
}
}
}
}
printf("%d", dist[n][m]);
return 0;
}
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 11657번 타임머신 (0) | 2019.11.29 |
---|---|
[백준] 16681번 등산 (0) | 2019.11.28 |
[백준] 1238번 파티 (0) | 2019.11.28 |
[백준] 4485번 녹색 옷 입은 애가 젤다지? (0) | 2019.11.28 |
[백준] 1753번 최단경로 (0) | 2019.11.27 |