다익스트라와 dp를 사용한 문제
dp[x][y][k]로 dist배열을 선언한다.
x,y까지 벽을 k만큼 뚫으면서 갔을 때 최단거리
기본적으로 bfs를 돌리면서 dp배열을 업데이트 시켜준다.
que에는 다 넣을 필요 없이 dp배열을 업데이트 시킬 때마다 넣어준다.
출처 :
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <stdio.h> #include <algorithm> #include <queue> #define n_ 1000 + 5 #define k_ 10 + 5 using namespace std; char adj[n_][n_]; int dp[n_][n_][k_]; int dx[4] = { 0, 1, 0, -1 }; int dy[4] = { 1, 0, -1, 0 }; int n, m, k; typedef struct Node{ int x, y, k; }node; queue<node> q; void bfs(){ q.push({ 0, 0, 0 }); dp[0][0][0] = 1; while (!q.empty()){ node now = q.front(); q.pop(); int a = now.x; int b = now.y; int c = now.k; for (int i = 0; i < 4; i++){ int nx = a + dx[i]; int ny = b + dy[i]; int nk = adj[nx][ny] - '0' + c; int nd = dp[a][b][c] + 1; if (nx == -1 || nx == n || ny == -1 || ny == m) continue; if (nk <= k&&nd < dp[nx][ny][nk]){ dp[nx][ny][nk] = nd; q.push({ nx, ny, nk }); } } } } int main(void) { scanf("%d %d %d", &n, &m, &k); for (int i = 0; i < n; i++){ scanf("%s", adj[i]); for (int j = 0; j < m; j++){ for (int l = 0; l <= k; l++){ dp[i][j][l] = 0x7fffffff; } } } bfs(); int res = 0x7fffffff; for (int i = 0; i <= k; i++){ res = min(res, dp[n - 1][m - 1][i]); } if (res == 0x7fffffff){ printf("-1\n"); } else{ printf("%d\n", res); } return 0; } | cs |
'알고리즘 > PS' 카테고리의 다른 글
[백준 14650] 걷다보니 신천역 삼 (Small) (0) | 2020.07.05 |
---|---|
[백준 1735] 분수 합 (0) | 2020.07.05 |
[백준 14432] 우물 (0) | 2018.06.06 |
[백준 13901] 로봇 (0) | 2018.06.04 |
[백준 10539] 수빈이와 수열 (0) | 2018.05.27 |