Link : https://www.acmicpc.net/problem/2251
Level : G5
์ ํ : dfs, bfs

๐ ๋ฌธ์ ํ์ํ๊ธฐ
A, B, C : ๊ฐ ๋ฌผํต์ ๋ถํผ
๋ฌผ๋ณ์ ๋ฌผ์ด ์ฐจ๋ ๊ฐ๋ฅํ ์ํ๋ 0๋ถํฐ ์ต๋ ์ฉ๋๊น์ง์ด๋ฏ๋ก ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ ๋ถํผ + 1 ์ด๋ค.
๋ฐ๋ผ์ ์๊ฐ ๋ณต์ก๋๋ O((A+1)*(B+1)*(C+1))์ด๋ค.
dfs๋ฅผ ์ด์ฉํด์ ์งํํ์๋ค.
๐ ์ฝ๋ ์ค๊ณํ๊ธฐ
1. ๋ถํผ A, B, C๋ฅผ ์ ๋ ฅ ๋ฐ๋๋ค.
2. dfs๋ฅผ ํธ์ถํ๋ค.
- ๋ฐฉ๋ฌธํ ๋ฌผ๋ณ์ ์ฒดํฌํ๋ค. (๋ฌดํ๋ฃจํ ๋ฐฉ์ง)
- ๊ฐ๋ฅํ ๋ฌผํต์ ์์ result์ ์ ์ฅํ๋ค.
- ๋ฌผ์ด ์ด๋ํ ์ ์๋ ๊ฒฝ์ฐ์ ์ 6๊ฐ์ง์ ๋ํด dfs๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๊ณ A์ ๋ฌผ์ ์์ด 0์ด ๋๋ฉด ์ข ๋ฃํ๋ค.
3. ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ๊ณ ์ค๋ณต์ ์ ๊ฑฐํ๋ค.
4. ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
๐ ์ ๋ต ์ฝ๋
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
int A, B, C;
set<vector<int>> visited;
vector<int> result;
void dfs(int a, int b, int c) {
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ํ๋ผ๋ฉด return
if (visited.count({a, b, c})) return;
// ํ์ฌ ์ํ๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์
visited.insert({a, b, c});
// A๊ฐ ๋น์ด์์ ๋ C์ ์์ ๊ฒฐ๊ณผ์ ์ถ๊ฐ
if (a == 0) result.push_back(c);
// ๋ฌผ์ ์ฎ๊ธฐ๋ 6๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ๊ณ ๋ ค
// A -> B
dfs(max(0, a - (B - b)), min(B, b + a), c);
// A -> C
dfs(max(0, a - (C - c)), b, min(C, c + a));
// B -> A
dfs(min(A, a + b), max(0, b - (A - a)), c);
// B -> C
dfs(a, max(0, b - (C - c)), min(C, c + b));
// C -> A
dfs(min(A, a + c), b, max(0, c - (A - a)));
// C -> B
dfs(a, min(B, b + c), max(0, c - (B - b)));
}
int main() {
cin >> A >> B >> C;
dfs(0, 0, C);
sort(result.begin(), result.end());
result.erase(unique(result.begin(), result.end()), result.end());
for (int x : result) {
cout << x << " ";
}
return 0;
}
'์ฝํ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ๋ณ ์ฐ๊ธฐ (0) | 2024.12.15 |
---|---|
[BOJ] ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (0) | 2024.08.11 |
[BOJ] ์ซ์ํ ์ ํ (0) | 2024.08.07 |
[BOJ] ๋ถ๋ถ์์ด์ ํฉ (1) | 2024.08.06 |
[BOJ] ๋ ์คํฐ์ปค (0) | 2024.08.05 |