BOJ 14442 벽 부수고 이동하기 2

2020. 12. 2. 15:40·알고리즘/BOJ

www.acmicpc.net/problem/14442

 

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

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.

www.acmicpc.net

 

기존 벽 부수고 이동하기 문제에선 오직 한 번만 벽을 부술 수 있었지만

2번 문제에선 총 10번까지 벽을 부술 수 있다.

따라서 기존 vis[MAX][MAX][2] 였던 배열을 vis[MAX][MAX][11]로 바꿔서 BFS 할 때 조금만 수정해주면 된다.

 

 

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
#include <iostream>
#include <string>
#include <queue>
using namespace std;
 
int n, m, k;
int vis[1001][1001][11];
string a[1001];
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
queue<pair<pair<int, int>, int>> q;
 
int bfs() {
    vis[0][0][0] = 1;
    q.push({ {0,0},0 });
 
    while (!q.empty()) {
        int x = q.front().first.first;
        int y = q.front().first.second;
        int block = q.front().second;
        q.pop();
        if (x == n - 1 && y == m - 1) return vis[x][y][block];
        for (int i = 0; i < 4; ++i) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
            if (a[nx][ny] == '0') { //벽이 아니라면 block을 증가시킬 필요 없음
                if (!vis[nx][ny][block]) { //방문하지 않았다면
                    vis[nx][ny][block] = vis[x][y][block] + 1;
                    q.push({ {nx,ny},block });
                }
            }
            else { //벽이라면 부술 수 있음
                if (block < k && !vis[nx][ny][block + 1]) { //벽을 부술 수 있고 부술 곳을 방문하지 않았다면
                    vis[nx][ny][block + 1] = vis[x][y][block] + 1;
                    q.push({ {nx,ny},block + 1 });
                }
            }
        }
    }
    return -1;
}
 
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
 
    cin >> n >> m >> k;
    for (int i = 0; i < n; ++i) cin >> a[i];
 
    cout << bfs() << endl;
 
    return 0;
}
Colored by Color Scripter
cs

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

BOJ 10164 격자상의 경로  (0) 2020.12.03
BOJ 6087 레이저 통신  (0) 2020.12.02
BOJ 3197 백조의 호수  (0) 2020.12.01
BOJ 1517 버블 소트  (0) 2020.11.26
BOJ 1005 ACM Craft  (0) 2020.11.25
'알고리즘/BOJ' 카테고리의 다른 글
  • BOJ 10164 격자상의 경로
  • BOJ 6087 레이저 통신
  • BOJ 3197 백조의 호수
  • BOJ 1517 버블 소트
khyu2
khyu2
  • khyu2
    dev log
    khyu2
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘
        • BOJ
        • Programmers
        • Algorithm
        • SWEA
      • 개발
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    dfs
    구현
    다익스트라
    유니온 파인드
    팰린드롬
    피사노 주기
    MST
    피보나치 수
    BFS
    분할 정복
    소수
    dp
    큐
    코딩테스트 연습
    알고리즘
    조합
    트리
    행렬 제곱
    냅색
    완전탐색
    이분탐색
    BOJ
    SWEA
    GREEDY
    완전 탐색
    프로그래머스
    우선순위 큐
    시뮬레이션
    이분 탐색
    크루스칼
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
khyu2
BOJ 14442 벽 부수고 이동하기 2
상단으로

티스토리툴바