맛있는감귤

BOJ : 14442 벽 부수고 이동하기2 본문

알고리즘/백준 알고리즘

BOJ : 14442 벽 부수고 이동하기2

맛있는감귤 2017. 3. 26. 23:46

문제 : https://www.acmicpc.net/problem/14442


벽 부수고 이동하기의 업그레이드 문제입니다.

기존의 문제는 벽 부술 수 있는 기회가 한번뿐이지만 이 문제는 K번이라는 것 빼고는 같은 문제에요.

visited배열을 3차원으로 만들어 visited[r][c][0 or 1 벽 부수기 스킬 사용 여부]를

visited[r][c][k]로 관리해주면 그만입니다.

입력이 뭉쳐서 나오니 잘 해결합시다. 저는 char 배열로 이어서 받았습니다.

int형 배열로 받고 싶다면 반복 for문으로 scanf("%1d",&map[i][j]); 이런 식으로 받으면 되겠죠.

그리고 이동이 1부터 시작하는 것도 유의하신다면 쉽게 AC받으실 수 있을거에요~

코드의 이해 안되시는 부분은 댓글 남겨주시면 정성껏 답변 해드리겠습니다!

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
#include <iostream>
#include <queue>
using namespace std;
 
struct Pos{
public:
    int r,c,k=0,cnt=0;
    Pos(){}
    Pos(int _r, int _c, int _k, int _cnt): r(_r), c(_c), k(_k), cnt(_cnt){}
};
int N,M,K;
char map[1002][1002];
int pr[4= {1,-1,0,0};
int pc[4= {0,0,1,-1};
bool visited[1002][1002][11];
queue<Pos> q;
 
int main(){
    scanf("%d%d%d",&N,&M,&K);
    for(int i=0;i<N;i++)
        cin>>map[i];
    
    q.push(Pos(0,0,0,1));
    visited[0][0][0= 1;
    
    while(!q.empty()){
        int r = q.front().r, c = q.front().c, k = q.front().k, cnt = q.front().cnt;
        q.pop();
        
        if(r == N-1 && c == M-1){
            cout<<cnt<<"\n";
            return 0;
        }
        for(int i=0;i<4;i++){
            int nr = r + pr[i];
            int nc = c + pc[i];
            if(nr < 0 || nc < 0 || nr >= N || nc >= M) continue;
            if(visited[nr][nc][k]) continue;
            if(map[nr][nc] == '1'){
                if(k < K) {
                    q.push(Pos(nr, nc, k+1, cnt+1)),
                    visited[nr][nc][k+1= 1;
                }
                continue;
            }
            visited[nr][nc][k] = 1;
            q.push(Pos(nr, nc, k, cnt+1));
        }
    }
    puts("-1\n");
}
cs


'알고리즘 > 백준 알고리즘' 카테고리의 다른 글

BOJ : 14226 이모티콘  (2) 2017.04.28
BOJ : 13913 숨바꼭질4  (0) 2017.04.28
BOJ : 9095 1,2,3 더하기  (0) 2017.03.26
BOJ : 11657 타임머신  (2) 2017.03.15
BOJ : 9517 아이 러브 크로아티아  (0) 2017.03.15