BOJ::14442 벽 부수고 이동하기 2
https://www.acmicpc.net/problem/14442
2206번 벽부수고 이동하기 의 상위 단계 문제이지만 매우 비슷하다.
2206을 아직 안풀어봤다면 2206번을 먼저 풀어보는게 좋을 것이다.
일반적인 미로찾기 bfs 에서 비용을 저장하는 d 배열을 3차원으로 만들었다 .
d[ ][ ][ x ] : 여기서 x 가 뜻하는것은 벽을 뚫은 횟수이다.
85번 줄에 int min = TMP_MAX 로 설정 했는데, 최소값 찾을 때 줄 큰 값으로 뭘 써야 할지 잘 모르겠다.
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #include <stdio.h> #include <queue> using namespace std; int n, m, k, x, y, v, ax, ay; int map[1000][1000]; int d[1000][1000][11]; int dx[] = { 1,-1,0,0 }; int dy[] = { 0,0,1,-1 }; struct Node { int x; int y; int v; //벽을 몇개 뚫었는지 Node(int _x, int _y, int _v) { x = _x; y = _y; v = _v; } }; void bfs(int a, int b) { d[a][b][0] = 1; queue<Node> q; q.push(Node(a, b, 0)); while (!q.empty()) { x = q.front().x; y = q.front().y; v = q.front().v; q.pop(); for (int i = 0; i < 4; i++) { ax = x + dx[i]; ay = y + dy[i]; if (ax >= 0 && ay >= 0 && ax < n&&ay < m) { if (map[ax][ay] == '0') { if (v == 0) { if (d[ax][ay][0] == 0 || d[ax][ay][0] > d[x][y][0] + 1) { d[ax][ay][0] = d[x][y][0] + 1; q.push(Node(ax, ay, 0)); } } if (d[ax][ay][v] == 0 || d[ax][ay][v] > d[x][y][v] + 1) { d[ax][ay][v] = d[x][y][v] + 1; q.push(Node(ax, ay, v)); } } else { if (v < k) { if (d[ax][ay][v + 1] == 0 || d[ax][ay][v+1] > d[x][y][v]+1) { d[ax][ay][v + 1] = d[x][y][v] + 1; q.push(Node(ax, ay, v + 1)); } } } } } } } void show() { for (int t = 0; t <= k; t++) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { printf("%d ", d[i][j][t]); } printf("\n"); } printf("\n"); } } int main() { scanf("%d %d %d", &n, &m, &k); getchar(); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { map[i][j] = getchar(); } getchar(); } bfs(0, 0); int min = TMP_MAX; for (int i = 0; i <= k; i++) { if (d[n-1][m-1][i] != 0 && d[n - 1][m - 1][i] < min) { min = d[n - 1][m - 1][i]; } } if (min == TMP_MAX) { printf("-1\n"); } else { printf("%d\n", min); } } | cs |
'BOJ::문제풀이' 카테고리의 다른 글
10159 저울 (0) | 2018.01.08 |
---|---|
14501 퇴사 (0) | 2018.01.07 |
13902 개업 2 (0) | 2018.01.07 |
13458 시험 감독 (0) | 2018.01.07 |
13305 주유소 (4) | 2018.01.07 |