본문 바로가기

Problem/BFS

[C/C++] BOJ 14923 :: 미로 탈출

BOJ 14923 :: 미로 탈출



문제 링크 : https://www.acmicpc.net/problem/14923






여러 번 풀었던 형식의 문제여서 풀이 방법을 바로 세워 풀 수 있었다.



★ 방문여부 배열을 x좌표, y좌표, key 사용 여부에 따른 3차원 배열로 만든다.

★ 하나의 좌표에서 key의 사용 여부에 따라 push를 두 번 해 주어야 할 때를 고려한다.





나의 코드



Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_14923/BOJ_14923.cpp



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
// 백준알고리즘 14923번 :: 미로 탈출
#include<iostream>
#include<queue>
using namespace std;
int N, M, Hx, Hy, Ex, Ey, ans, flag;
queue <pair<pair<intint>int>> q;
int miro[1002][1002];
// x좌표, y좌표, 지팡이 사용여부
bool visited[1001][1001][2];
int dx[4= { 0,0,-1,1 };
int dy[4= { 1,-1,0,0 };
int main(void)
{
    cin >> N >> M;
    cin >> Hx >> Hy >> Ex >> Ey;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= M; j++)
        {
            cin >> miro[i][j];
        }
    }
    visited[Hx][Hy][1= true;
    q.push(make_pair(make_pair(Hx, Hy), 1));
    while (!q.empty())
    {
        int qsz = q.size();
        while (qsz--)
        {
            int x = q.front().first.first;
            int y = q.front().first.second;
            int key = q.front().second;
            q.pop();
            if (x == Ex && y == Ey) {
                flag = 1break;
            }
            for (int i = 0; i < 4; i++)
            {
                int mx = x + dx[i];
                int my = y + dy[i];
                int nkey = key;
                if (mx < 1 || mx > N || my < 1 || my > M) continue;
                if (visited[mx][my][nkey]) continue;
                // miro가 0이면 key가 있든 없든 쓰지 않고 갈 수 있다.
                if (!miro[mx][my])
                {
                    visited[mx][my][nkey] = true;
                    q.push(make_pair(make_pair(mx, my), nkey));
                }
                // 1이면 key가 있어야 갈 수 있다.
                if(miro[mx][my] && nkey)
                {
                    nkey = 0;
                    visited[mx][my][nkey] = true;
                    q.push(make_pair(make_pair(mx, my), nkey));
                }
            }
        }
        if (flag) break;
        ans++;
    }
    if(flag) cout << ans;
    else cout << -1;
    return 0;
}
 
cs


'Problem > BFS' 카테고리의 다른 글

[C/C++] BOJ 1726 :: 로봇  (0) 2019.02.07
[C/C++] BOJ 10026 :: 적록색약  (0) 2019.02.06
[C/C++] BOJ 3184 :: 양  (0) 2019.01.23
[C/C++] BOJ 2146 :: 다리 만들기  (0) 2019.01.22
[백준알고리즘] 15653번 구슬 탈출4  (0) 2019.01.06