※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 24884번 문제인 장작 넣기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/24884
24884번: 장작 넣기
첫째 줄에 모닥불의 개수 $N$, SKH의 시작 모닥불 번호 $W$, 모닥불 놀이 시간 $T$, 유지해야 하는 최소 모닥불의 개수 $K$가 공백을 사이에 두고 주어진다. ($1 \le N \le 6$, $0 \le W < N$, $1 \le T \le 11$, $1 \le
www.acmicpc.net
문제에 주어져있는 조건을 꼼꼼히 잘 읽고 가능한 모든 SKH의 움직임의 경우를 따라 시뮬레이션하여 T시간 뒤에 살아남은 모닥불의 개수가 K개 이상인 경우의 수를 계수하자.
문제에서 주어진 모닥불의 index가 0-based라는 점에 주의하여 구현하자. 또한, 장작을 넣는 행동과 모닥불의 화력간의 관계를 오인하지 않고 문제에서 주어진 대로만 구현하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
int N, W, T, K;
int ans = 0;
void func(vector<int> VEC, int curTime, int idx) {
if (curTime == T) {
int cnt = 0;
for (auto x : VEC) {
if (x) cnt++;
}
if (cnt >= K) ans++;
}
else {
vector<int> diff(N), vec = VEC;
for (int i = 0; i < N; i++) {
diff[i] = 3;
if (i > 0) {
if (vec[i - 1]) diff[i]--;
}
if (i < N - 1) {
if (vec[i + 1]) diff[i]--;
}
}
for (int i = 0; i < N; i++) {
vec[i] -= diff[i];
vec[i] = max(vec[i], 0);
}
vec[idx] = VEC[idx];
func(vec, curTime + 1, idx);
idx--;
vec = VEC;
if (idx > -1) {
for (int i = 0; i < N; i++) {
diff[i] = 3;
if (i > 0) {
if (vec[i - 1]) diff[i]--;
}
if (i < N - 1) {
if (vec[i + 1]) diff[i]--;
}
}
for (int i = 0; i < N; i++) {
vec[i] -= diff[i];
vec[i] = max(vec[i], 0);
}
vec[idx] = VEC[idx];
func(vec, curTime + 1, idx);
}
idx += 2;
vec = VEC;
if (idx < N) {
for (int i = 0; i < N; i++) {
diff[i] = 3;
if (i > 0) {
if (vec[i - 1]) diff[i]--;
}
if (i < N - 1) {
if (vec[i + 1]) diff[i]--;
}
}
for (int i = 0; i < N; i++) {
vec[i] -= diff[i];
vec[i] = max(vec[i], 0);
}
vec[idx] = VEC[idx];
func(vec, curTime + 1, idx);
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> W >> T >> K;
vector<int> vec;
for (int i = 0; i < N; i++) {
int x; cin >> x;
vec.emplace_back(x);
}
vector<int> diff(N);
for (int i = 0; i < N; i++) {
diff[i] = 3;
if (i > 0) {
if (vec[i - 1]) diff[i]--;
}
if (i < N - 1) {
if (vec[i + 1]) diff[i]--;
}
}
for (int i = 0; i < N; i++) {
vec[i] -= diff[i];
vec[i] = max(vec[i], 0);
}
func(vec, 1, W);
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 3111 // C++] 검열 (0) | 2022.04.14 |
---|---|
[BOJ 24912 // C++] 카드 색칠 (0) | 2022.04.13 |
[BOJ 24891 // C++] 단어 마방진 (0) | 2022.04.11 |
[BOJ 24418 // C++] 알고리즘 수업 - 행렬 경로 문제 1 (0) | 2022.04.10 |
[BOJ 24430 // C++] 알고리즘 수업 - 행렬 경로 문제 7 (0) | 2022.04.10 |