본문 바로가기
Develop/백준 (Cpp)

[백준] 14497번: 주난의 난(難) (C++)

by Tarra 2023. 7. 14.

14497번: 주난의 난(難)


 

문제)

주난이는 크게 화가 났다. 책상 서랍 안에 몰래 먹으려고 숨겨둔 초코바가 사라졌기 때문이다. 주난이는 미쳐 날뛰기 시작했다. 사실, 진짜로 뛰기 시작했다.

‘쿵... 쿵...’

주난이는 점프의 파동으로 주변의 모든 친구들을 쓰러뜨리고(?) 누군가 훔쳐간 초코바를 찾으려고 한다. 주난이는 N×M크기의 학교 교실 어딘가에서 뛰기 시작했다. 주난이의 파동은 상하좌우 4방향으로 친구들을 쓰러뜨릴(?) 때 까지 계속해서 퍼져나간다. 다르게 표현해서, 한 번의 점프는 한 겹의 친구들을 쓰러뜨린다. 다음의 예를 보자.

1 # 1 0 1 1 1
1 1 0 1 0 0 1
0 0 1 * 1 1 1
1 1 0 1 1 1 1
0 0 1 1 0 0 1

주난이를 뜻하는 *은 (3, 4)에 있고, 초코바를 가진 학생 #는 (1, 2)에 있다. 0은 장애물이 없는 빈 공간임을 뜻하고, 1은 친구들이 서있음을 의미한다. 다음은 주난이의 점프에 따른 생존(?) 학생들의 변화이다.

1 # 1 0 1 1 1
1 1 0 0 0 0 1
0 0 0 * 0 1 1
1 1 0 0 1 1 1
0 0 1 1 0 0 1

 

1 # 0 0 0 0 1
0 0 0 0 0 0 0
0 0 0 * 0 0 1
0 0 0 0 0 1 1
0 0 0 0 0 0 1

 

0 X 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 * 0 0 0
0 0 0 0 0 0 1
0 0 0 0 0 0 0

위의 예시에서 주난이는 3번의 점프 만에 초코바를 훔쳐간 범인을 찾아낼 수 있다!

주난이를 빨리 멈춰야 교실의 안녕을 도모할 수 있다. 주난이에게 최소 점프 횟수를 알려줘서 교실을 지키자.

 

 

 

입력 :

첫째 줄에 주난이가 위치한 교실의 크기 N, M이 주어진다. (1 ≤ N, M ≤ 300)

둘째 줄에 주난이의 위치 x1, y1과 범인의 위치 x2, y2가 주어진다. (1 ≤ x1, x2 ≤ N, 1 ≤ y1, y2 ≤ M)

이후 N×M 크기의 교실 정보가 주어진다. 0은 빈 공간, 1은 친구, *는 주난, #는 범인을 뜻한다.

 

 

 

출력 :

주난이가 범인을 잡기 위해 최소 몇 번의 점프를 해야 하는지 출력한다.

 

 

 

 

 

힌트)

 

 

 

풀이)

 

+ 추가

비쥬얼 스튜디오에서 변수 y1을 설정할 경우, 

이전에 사용된 함수라면서 에러가 발생하게 된다. (백준에서는 이상이 없음)

이러한 에러가 발생한 이유는

math.h에 y1이라는 함수가 이미 존재해서 (해당 함수는 Bessel 함수로 파동, 진동, 회전체 등의 문제를 해결하는데 사용한다고 함.)

비쥬얼 스튜디오에서 에러를 발생시킨 것이다. (math.h 헤더를 포함하지 않았음에도)

 

 

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>;
#include <string>
 
using namespace std;
 
int n, m;
int x1, y1, x2, y2;
int turn = 1;
 
int dx[] = { -1100 };
int dy[] = { 00-11 };
 
vector<string> vec;
int visited[302][302];
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
 
    cin >> n >> m >> x1 >> y1 >> x2 >> y2;
    x1--; y1--; x2--; y2--;
 
    string temp;
    for (int i = 0; i < n; i++)
    {
        cin >> temp;
        vec.push_back(temp);
    }
    
    // 주난이는 범인을 찾을 때까지 뛸 것이므로
    while (1)
    {
        // 뛸 때마다 visited를 재설정해야한다.
        fill(&visited[0][0], &visited[0][0+ 302 * 3020);
 
        queue<pair<intint>> q;
        visited[x1][y1] = turn;
        q.push(make_pair(x1, y1));
 
        // bfs를 이용하여 한번 뛰었을 때의 파동을 전파시켜야한다.
        while (!q.empty())
        {
            int x = q.front().first;
            int y = q.front().second;
            q.pop();
 
            // 범인을 찾았을 경우
            if (x == x2 && y == y2)
            {
                cout << visited[x][y];
                return 0;
            }
 
            // 파동은 4방향으로 퍼져나간다.
            for (int j = 0; j < 4; j++)
            {
                int nx = x + dx[j];
                int ny = y + dy[j];
 
                if (nx < 0 || nx >= n) continue;
                if (ny < 0 || ny >= m) continue;
                if (visited[nx][ny]) continue;
                // 만약 파동이 친구를 만났을 경우에.
                if (vec[nx][ny] == '1')
                {
                    // 친구를 무너뜨리고
                    vec[nx][ny] = '0';
                    // 해당 배열의 위치는 방문처리를 한 뒤, 
                    // 파동을 제거해야 한다.(큐에 추가하지 않음)
                    visited[nx][ny] = turn;
                    continue;
                }
                visited[nx][ny] = turn;
                q.push(make_pair(nx, ny));
            }
        }
        // 점프한 횟수 추가
        turn++;
    }
 
    return 0;
}
cs

 

 


출처 : https://www.acmicpc.net/problem/14497 

 

14497번: 주난의 난(難)

주난이는 크게 화가 났다. 책상 서랍 안에 몰래 먹으려고 숨겨둔 초코바가 사라졌기 때문이다. 주난이는 미쳐 날뛰기 시작했다. 사실, 진짜로 뛰기 시작했다. ‘쿵... 쿵...’ 주난이는 점프의 파

www.acmicpc.net