문제 출처: https://www.acmicpc.net/problem/12761


풀이

문제에서 주어진 조건들로 하여금 BFS를 돌리면 됩니다. 해결해야할 조건은 다음과 같습니다.


1. 현위치에서 한칸 왼쪽가기

2. 현위치에서 한칸 오른쪽가기

3. 현위치에서 a칸 왼쪽 가기

4. 현위치에서 a칸 오른쪽가기

5. 현위치에서 b칸 왼쪽 가기

6. 현위치에서 b칸 오른쪽가기

7. 현위치의 a배 왼쪽가기

->현위치의 a배는 무조건 값이 0보다 작게되므로 불가능 

8. 현위치의 a배 오른쪽가기

9. 현위치의 b배 왼쪽가기 

->현위치의 b배는 무조건 값이 0보다 작게되므로 불가능 

10.현위치의 b배 오른쪽가기


총 8가지 조건만 잘 작성하면됩니다.


코드

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
#include <iostream>
#include<queue>
using namespace std;
int a, b, n, m;
int map[100001], visited[100001], cnt;
void bfs(int start,int  cnt);
int main(void)
{
    cin >> a >> b >> n >> m;
    bfs(n,0);
}
void bfs(int start,int cnt)
{
    queue<pair<intint>>q;
    q.push({ start,0 });
    visited[start] = 1;
    while (!q.empty())
    {
        start = q.front().first;
        cnt = q.front().second;
        q.pop();
        if (start == m)
        {
            cout << cnt << endl;
            return;
        }
       //한칸 왼쪽 가기
        if(start-1>=0&&!visited[start-1])
        {
            visited[start - 1= 1;
            q.push({ start - 1,cnt + 1 });
        }
        //한칸 오른쪾 가기
        if (start + 1 <= 100000 && !visited[start + 1])
        {
            visited[start + 1= 1;
            q.push({ start + 1,cnt + 1 });
        }
 
        //현위치에서 a만큼 왼쪽가기
        if (start - a >= 0 && !visited[start - a])
        {
            visited[start - a] = 1;
            q.push({ start - a,cnt + 1 });
        }
        //현위치에서 a만큼 오른쪽가기
        if (start + a <= 100000 && !visited[start + a])
        {
            visited[start + a] = 1;
            q.push({ start + a,cnt + 1 });
        }
        //현위치에서 b만큼 왼쪽 가기
        if (start - b >= 0 && !visited[start - b])
        {
            visited[start - b] = 1;
            q.push({ start - b,cnt + 1 });
        }
        //현위치에서 b만큼 오른쪽 가기
        if (start + b >= 0 && !visited[start + b])
        {
            visited[start + b] = 1;
            q.push({ start + b,cnt + 1 });
        }
        //현 위치의 a배 오른쪽가기
        if (start *<= 100000 && !visited[start * a])
        {
            visited[start * a] = 1;
            q.push({ start * a,cnt + 1 });
        }
        
        //현 위치의 b배 오른쪽가기
        if (start * b <= 100000 && !visited[start * b])
        {
            visited[start * b] = 1;
            q.push({ start * b,cnt + 1 });
        }
    }
}
cs


결과



'문제풀이(BOJ) > DFS,BFS' 카테고리의 다른 글

[백준 2206] 벽 부수고 이동하기  (0) 2020.02.11
[백준 17836] 공주님을 구해라!  (0) 2020.02.10
[백준 1759] 암호 만들기  (0) 2020.02.06
[백준] 촌수계산  (0) 2020.01.20
[백준 2589] 보물섬(BFS)  (0) 2020.01.17

+ Recent posts