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
      • 개발
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.