https://www.acmicpc.net/problem/12869
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct SCV
{
int F, S, T;
};
int attack[6][3]{
{9,3,1},
{9,1,3},
{3,9,1},
{3,1,9},
{1,3,9},
{1,9,3}
};
int n;
int hp[61][61][61];
queue<SCV> scv;
vector<int>temp;
int BFS()
{
hp[scv.front().F][scv.front().S][scv.front().T] = 1;
while (scv.empty() == false)
{
int f = scv.front().F;
int s = scv.front().S;
int t = scv.front().T;
scv.pop();
if (f == 0 && s == 0 && t == 0)
break;
for (int i = 0; i < 6; i++)
{
int damageF = max(0 ,f-attack[i][0]);
int damageS = max(0 ,s-attack[i][1]);
int damageT = max(0 ,t-attack[i][2]);
if (hp[damageF][damageS][damageT] != 0)
continue;
hp[damageF][damageS][damageT] = hp[f][s][t] + 1;
scv.push({ damageF,damageS,damageT });
}
}
return hp[0][0][0]-1;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
int a{ };
cin >> a;
temp.push_back(a);
}
scv.push({ temp[0],temp[1],temp[2] });
cout<<BFS()<<endl;
}
- SCV의 수가 최대 3명이고, 데미지의 경우의 수가 총 6개를 3명한태 나눠야한다
- 그를 위해 attack 이차원 배열을 만들어 경우의 수를 모두 저장해준다
- 또한 3차원 배열을 만들어 각각의 SCV의 체력을 index로 사용하여 그 배열에 index에 들어간 회차(?)를 count하여 모든 SCV의 체력이 0일 때 값을 출력해준다
- 이를 위해 struct 로 SCV의 각각의 체력을 저장해줄 수 있에 해주고 이를 queue에 사용할 곳이다
- 이제 SCV의 체력을 입력받아 queue에 저장해주고 BFS를 돌리면 될것이다
- BFS를 시작하면서 hp 배열에 SCV 체력을 index로 현재 배열에 1을 저장해주고, while문을 돌면서 일반적으로 BFS를 만들어 줄 것이다
- 이때 for문안에서 damage를 계산할 것인데 현재 scv체력과 attack배열에 경우의 수들을 뺀뒤 0과 비교해 큰 수를 damage에 저장해 이를 hp배열에 넣어 0이 아니면 continue를, 그렇지 않으면 hp에 index로 사용해 이전 hp에 1을 더한 값을 저장해주고 queue에 저장해준다
- 이러한 과정을 거치고 함수가 탈출할 때 hp가 모두 0일때를 return해주면 된다
'코딩 태스트 > 문제풀이' 카테고리의 다른 글
최댓값과 최솟값 - 12939 (0) | 2025.03.10 |
---|---|
괄호 추가하기 (0) | 2025.02.05 |
인구이동(x) (0) | 2025.01.20 |
치킨 배달(x) (0) | 2025.01.20 |
불!(x) (0) | 2025.01.16 |