백준 4485번 녹색 옷 입은 애가 젤다지?
사용한 알고리즘 : 다익스트라
우선 이 문제와 같이 그래프 상에서 상하좌우 를 이동하는 경우 제가 짠 것과 같이 X 행 Y 열 이동하는 행렬을 별도로 만들어 놓고 for 구문으로 4번씩 보며 이동하면 편합니다..... ( 혹은 행열을 하나로 묶어서 [2][4] 행렬로 만들어도 편해요...)
각 위치의 도둑루피의 값을 cave[130][130] 에 저장하고 dist[130][130] 으로 [0][0]에서 각 위치까지 얼마의 값으로 갈 수 있는지 알아봤습니다.
우선 모든 dist 값을 INF 값으로 설정 후,
dist[0][0] 값을 0 으로 하고 이 위치 (0,0)을 pq(priority_queue)에 넣고 시작 합니다.
pq에서 위치의 값을 하나씩 빼내, 이 위치를 (a,b) 라 하면,
이 위치에서 이동가능한 상하좌우(X,Y) 중에서, dist[X][Y] > dist[a][b] + cave[X][Y] (도둑루피값)
인 경우 값을 최신화 하고,
최신화 된 위치를 다시 pq에 넣어 돌렸습니다.
참고로 출력이 "Problem 1: 20" 꼴인데, 띄어쓰기를 잘못하여 많이 틀렸습니다...
여러분들은 이런 실수 없으시길 바라겠습니다......
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
using namespace std; | |
#define pii pair<int, int> | |
const int INF = 987654321; | |
int N, temp; | |
int cave[130][130]; | |
int dist[130][130]; | |
int goX[4] = {0,0,1,-1}; | |
int goY[4] = {1,-1,0,0}; | |
struct cmp{ | |
bool operator()(const pii &t, const pii &u){ | |
if(dist[t.first][t.second] == dist[u.first][u.second]) | |
return t.first+t.second < u.first+u.second; | |
return dist[t.first][t.second] > dist[u.first][u.second]; | |
} | |
}; | |
priority_queue<pii , vector<pii>, cmp> Que; | |
int main(){ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL); | |
while(1){ | |
temp++; | |
cin >> N; | |
if(N==0) break; | |
for (int i = 0; i < N; ++i){ | |
for (int j = 0; j < N; ++j){ | |
cin >> cave[i][j]; | |
dist[i][j] = INF; | |
} | |
} | |
dist[0][0] = cave[0][0]; | |
Que.push(pii(0,0)); | |
while(!Que.empty()){ | |
pii now = Que.top(); | |
int a = now.first; | |
int b = now.second; | |
Que.pop(); | |
for (int i = 0; i < 4; ++i){ | |
int X = a + goX[i]; | |
int Y = b + goY[i]; | |
if(X<0 || X>=N || Y<0 || Y>=N) continue; | |
if(dist[X][Y] > (dist[a][b]+cave[X][Y])){ | |
dist[X][Y] = dist[a][b]+cave[X][Y]; | |
Que.push(pii(X,Y)); | |
} | |
} | |
} | |
cout << "Problem "<< temp << ": "<< dist[N-1][N-1] << '\n'; | |
} | |
return 0; | |
} |
댓글
댓글 쓰기
긴 글 읽어주셔서 감사합니다.
궁금한게 있으시다면 댓글 달아주세요!