코딩공작소

[백준]말이 되고픈 원숭이 본문

알고리즘/그래프

[백준]말이 되고픈 원숭이

안잡아모찌 2019. 10. 9. 09:52

https://www.acmicpc.net/problem/1600

 

1600번: 말이 되고픈 원숭이

첫째 줄에 자연수 K가 주어진다. 둘째 줄에 격자판의 가로길이 W, 세로길이 H가 주어진다. 그 다음 H줄에 걸쳐 W개의 숫자가 주어지는데, 0은 아무것도 없는 평지, 1은 장애물을 뜻한다. 장애물이 있는 곳으로는 이동할 수 없다. 시작점과 도착점은 항상 평지이다. W와 H는 1이상 200이하의 자연수이고, K는 0이상 30이하의 정수이다.

www.acmicpc.net

 

벽 부수고 이동하기2 와 비슷한 문제였던거 같다.

 

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
#include <iostream>
#include <queue>
using namespace std;
 
struct INFO {
    int r, c, k;
};
 
int K, N, M;
int map[200][200], isV[200][200][31];
int jr[] = { -1,-2,-2,-1,1,2,2,1 }, jc[] = { -2,-1,1,2,-2,-1,1,2 }, dr[] = { 0,0,-1,1 }, dc[] = { 1,-1,0,0 };
queue<INFO> q;
 
void solve() {
    while (!q.empty()) {
        int r = q.front().r, c = q.front().c, k = q.front().k; q.pop();
        if (r == N - 1 && c == M - 1) { printf("%d\n", isV[r][c][k]); return; }
        if (k > 0) {
            for (int i = 0; i < 8; i++) {
                int nr = r + jr[i], nc = c + jc[i];
                if (nr < 0 || nc < 0 || nr >= N || nc >= M || isV[nr][nc][k - 1|| map[nr][nc] == 1)continue;
                q.push({ nr,nc,k - 1 });
                isV[nr][nc][k - 1= isV[r][c][k] + 1;
            }
        }
        for (int i = 0; i < 4; i++) {
            int nr = r + dr[i], nc = c + dc[i];
            if (nr < 0 || nc < 0 || nr >= N || nc >= M || isV[nr][nc][k] || map[nr][nc] == 1continue;
            q.push({nr, nc, k});
            isV[nr][nc][k] = isV[r][c][k] + 1;
        }
    }
    printf("-1\n");
}
 
int main() {
    ios::sync_with_stdio(false); cin.tie(NULL);
    cin >> K >> M >> N;
    for (int i = 0; i < N; i++)for (int j = 0; j < M; j++) { cin >> map[i][j]; }
    q.push({ 0,0,K });
    solve();
    return 0;
}
cs

'알고리즘 > 그래프' 카테고리의 다른 글

[프로그래머스]단어변환  (0) 2019.10.26
[프로그래머스]네크워크  (0) 2019.10.26
[백준]달이차오른다,가자  (0) 2019.10.08
[백준]영역구하기  (0) 2019.10.08
[백준]낚시왕(2)  (0) 2019.09.28