[백준] 2251: 물통 - JAVA
https://www.acmicpc.net/problem/2251
풀이
물통 세 개의 부피가 정해져 있고 초기에는 C물통만 가득 차 있다.
A물통이 비어있을 때마다 C물통의 양을 체크하여 저장하면 되는 문제이다.
A, B, C물통의 양을 방문처리하기 위해 boolean[][][] 배열을 이용했고,
C물통의 양을 오름차순으로 저장하기 위해 TreeSet을 이용했다.
dfs탐색을 통해 진행하며 물통의 양을 체크했고,
A물통에 물이 있다면 “A물통의 양 + B물통의양”과 “B물통의 용량”을 비교하여 A물통에서 B물통으로 옮기는 경우를 처리했다.
메모리: 23284KB
시간: 140ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static int A, B, C;
static boolean[][][] visit;
static TreeSet<Integer> set;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
visit = new boolean[C + 1][C + 1][C + 1];
set = new TreeSet<>();
dfs(0, 0, C);
StringBuilder sb = new StringBuilder();
set.stream().forEach(num -> sb.append(num + " "));
System.out.println(sb);
}
private static void dfs(int a, int b, int c) {
if (visit[a][b][c]) {
return;
}
if (a == 0) {
set.add(c);
}
visit[a][b][c] = true;
if (a > 0) {
if (a + b > B) {
dfs(a + b - B, B, c);
} else {
dfs(0, a + b, c);
}
if (a + c > C) {
dfs(a + c - C, b, c);
} else {
dfs(0, b, a + c);
}
}
if (b > 0) {
if (b + c > C) {
dfs(a, b + c - C, C);
} else {
dfs(a, 0, b + c);
}
if (b + a > A) {
dfs(A, b + a - A, c);
} else {
dfs(b + a, 0, c);
}
}
if (c > 0) {
if (c + a > A) {
dfs(A, b, c + a - A);
} else {
dfs(c + a, b, 0);
}
if (c + b > B) {
dfs(a, B, c + b - B);
} else {
dfs(a, c + b, 0);
}
}
}
}