본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 14867 물통

by 까망 하르방 2021. 3. 30.
반응형

출처: www.acmicpc.net/problem/14867

Approach

BFS (Breadth-First Search, 너비 우선 탐색) 이용

 

BFS (Breadth-First Search, 너비 우선 탐색)

BFS 그래프 전체를 탐색하되, 인접한 노드들을 차례대로 방문합니다. Queue 이용 * DFS로 풀리는 문제는 일반적으로 BFS로도 풀 수 있습니다. Process ※ 깊이 우선 탐색과는 달리 너비 우선 탐색에서

zoosso.tistory.com

DFS와 BFS 비교

 

DFS와 BFS 비교

출처: 나무위키 경로 비교 BFS - Queue 이용 - 최소신장트리(Minimum Spanning Trees), 최단경로(Shortest Paths) 장점: 무한히 깊거나 무한에 가까운 트리인 경우에 효과적 단점: 목표 노드로 가는 경로들 모..

zoosso.tistory.com

 


#include <stdio.h>
const int MAX_N = 100005;
int A, B, ta, tb;
int visited[4][MAX_N];
int fr, re;

struct Data {
    int a, b, lev;
}que[MAX_N * 4];

void push(int na, int nb, int nl) {
    int r = 3, c = na;
    if (na == 0) r = 0, c = nb;
    else if (na == A) r = 1, c = nb;
    else if (nb == 0) r = 2, c = na;
    if (visited[r][c]) return;
    visited[r][c] = 1;
    que[re++] = { na, nb, nl };
}

int BFS() {
    push(0, 0, 0);
    Data t;

    while (fr < re) {
        t = que[fr++];
        if (t.a == ta && t.b == tb) return t.lev;
        push(0, t.b, t.lev + 1); // A 물통 비우기
        push(A, t.b, t.lev + 1); // A 물통 가득 채우기
        push(t.a, 0, t.lev + 1); // B 물통 비우기
        push(t.a, B, t.lev + 1); // B 물통 가득 채우기
        
        // B 물통의 물을 A에 붓기
        if (t.a + t.b < A)
            push(t.a + t.b, 0, t.lev + 1);
        else
            push(A, t.a + t.b - A, t.lev + 1);
        
        // A 물통의 물을 B에 붓기
        if (t.a + t.b < B)
            push(0, t.a + t.b, t.lev + 1);
        else
            push(t.a + t.b - B, B, t.lev + 1);
    }
    return -1;
}

int main() {
    // freopen("input.txt", "r", stdin);
    scanf("%d %d %d %d", &A, &B, &ta, &tb);
    printf("%d\n", BFS());
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 2529 부등호  (0) 2021.04.01
[BOJ] 백준 2665 미로만들기  (0) 2021.03.31
[BOJ] 백준 17616 등수 찾기  (0) 2021.03.13
[BOJ] 백준 1654 랜선 자르기  (0) 2021.03.06
[BOJ] 백준 11727 2×n 타일링 2  (0) 2021.03.01

댓글