※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2251번 문제인 물통이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/2251 

 

2251번: 물통

각각 부피가 A, B, C(1≤A, B, C≤200) 리터인 세 개의 물통이 있다. 처음에는 앞의 두 물통은 비어 있고, 세 번째 물통은 가득(C 리터) 차 있다. 이제 어떤 물통에 들어있는 물을 다른 물통으로 쏟아 부

www.acmicpc.net

현재 존재하는 물통의 상태에서 다음 상태로 가능한(각 물통을 들어 다른 물통에 붓는 행동) 상태 중 아직 탐색 시작을 하지 않은 상태를 계속 탐색해나가는 것으로 문제를 해결해나갈 수 있다.

 

"A물통이 비어있을 때의" 가능한 C물통의 물의 양을 출력해야함에 유의하자.

 

0 또한 C물통의 가능한 물의 양임을 놓치지 말자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int A, B, C;
bool ans[201];
int visited[201][201][201];

void func(int a, int b, int c) {
	visited[a][b][c] = 1;
	if (a == 0) ans[c] = 1;
	int d = min(a, B - b);
	if (!visited[a - d][b + d][c]) func(a - d, b + d, c);
	d = min(a, C - c);
	if (!visited[a - d][b][c + d]) func(a - d, b, c + d);
	d = min(b, A - a);
	if (!visited[a + d][b - d][c]) func(a + d, b - d, c);
	d = min(b, C - c);
	if (!visited[a][b - d][c + d]) func(a, b - d, c + d);
	d = min(c, A - a);
	if (!visited[a + d][b][c - d]) func(a + d, b, c - d);
	d = min(c, B - b);
	if (!visited[a][b + d][c - d]) func(a, b + d, c - d);
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> A >> B >> C;
	func(0, 0, C);

	for (int i = 0; i <= C; i++) {
		if (ans[i]) cout << i << ' ';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 6031 // C++] Feeding Time  (0) 2022.05.08
[BOJ 1162 // C++] 도로포장  (0) 2022.05.07
[BOJ 15967 // C++] 에바쿰  (0) 2022.05.05
[BOJ 21213 // C++] Mentors  (0) 2022.05.04
[BOJ 18405 // C++] 경쟁적 전염  (0) 2022.05.03

+ Recent posts