알고리즘/DFS
[백준] 20208-진우의 민트초코우유(C++)
잉읭응
2021. 1. 17. 14:41
반응형
문제링크: www.acmicpc.net/problem/20208
20208번: 진우의 민트초코우유
첫번째 줄에 민초마을의 크기인 N과 진우의 초기체력 M, 그리고 민트초코우유를 마실때 마다 증가하는 체력의 양 H가 공백을 두고 주어진다. N, M, H는 모두 10보다 작거나 같은 자연수이다. 두번째
www.acmicpc.net
n*n은 100이므로 각각의 좌표를 전부 검사해주는 행동은 당연히 시간초과
"민트초코우유의 총합은 10개를 넘지 않는다." 라는 조건을 사용하여야 합니다. 즉, 각 좌표들의 거리로 탐색해야 합니다.
이때, 조합이 아니라 순열구조이므로 10! 만큼 소모될수 있습니다. 시간적으로 괜찮을 것을 확인했다면
바로 구현하면 됩니다.
정답코드입니다.
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
typedef struct MyStruct
{
int y;
int x;
bool checked;
}val;
int n = 0, m = 0, h = 0;
int result = 0;
int arr[10][10] = { 0, };
val house;
vector <val> mint;
void dfs(int y, int x,int cur, int cnt, int hp) {
if (cnt > result) {// 방문횟수가 더 많고
if (abs(y - house.y) + abs(x - house.x) <= hp)
result = cnt;
}
if (hp <= 0)
return;
for (int i = 0; i < mint.size(); i++) {
int len = abs(mint[i].y - y) + abs(mint[i].x - x);
if (len <= hp && mint[i].checked == 0) {
mint[i].checked = 1;
dfs(mint[i].y, mint[i].x, i+1, cnt + 1, hp - len + h);
mint[i].checked = 0;
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m >> h;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++){
int temp = 0;
cin >> temp;
if (temp == 1)
house.y = i, house.x = j;
else if (temp == 2)
mint.push_back({ i,j,0 });
}
}
dfs(house.y,house.x,0, 0, m);
cout << result << endl;
return 0;
}
간혹 조합과 수열 구현을 헷갈려 하시는데, 아래 링크 참고하시면 좋을 것 같습니다.
paris-in-the-rain.tistory.com/35
순열, 조합 알고리즘 - DFS로 구하기(백트래킹), C++, Python
순열, 조합은 정말정말 많이 나오는데 cpp의 stl 라이브러리 중 next_permutation으로 구할 수 있다. 하지만 next_permutation은 N이 20만 넘어가도 터질 위험에 처한다.. 시간복잡도가 크기 때문이다. N이 10
paris-in-the-rain.tistory.com
반응형