반응형
https://www.acmicpc.net/problem/17136
dfs를 이용하여 풀었습니다.
dfs를 사용할때 가지치기를 똑바로 하지 않으면 시간초과가 발생하여 아래 코드에서 if (out == true) break; 이부분이 중요하였습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#include<iostream>
#include<algorithm>
using namespace std;
int ans, cnt;
int paper[11][11];
int paper_cnt[6];
bool pa_ch(int x, int y, int sizee) {
for (int Y = y; Y < y + sizee; Y++) {
for (int X = x; X <x + sizee; X++) {
if (paper[Y][X] == 0)
return false;
}
}
return true;
}
void dfs(int ans_temp, int x, int y, int cnt_temp) {
if (ans_temp > ans) return;
if (cnt_temp == cnt) {
ans = ans_temp;
return;
}
if (ans_temp == 25) return;
bool out = false;
for (int Y = y; Y < 10; Y++) {
for (int X = x; X < 10; X++) {
if (paper[Y][X] == 1) {
out = true;
for (int i = 5; i >= 1; i--) { //1x1부터 5x5까지 탐색
if (paper_cnt[i] == 0) continue;
if (paper_cnt[i] == 0 && i == 1) return;
if (!pa_ch(X, Y, i)) continue;
paper_cnt[i]--;
int gob = i*i;
for (int YY = Y; YY < Y + i; YY++) {
for (int XX = X; XX < X + i; XX++) {
paper[YY][XX] = 0;
} //for XX
} // for YY
dfs(ans_temp + 1, X, Y, cnt_temp + gob);
paper_cnt[i]++;
for (int YY = Y; YY < Y + i; YY++) {
for (int XX = X; XX <X + i; XX++) {
paper[YY][XX] = 1;
}//for XX
}//for YY
} //for i
} //if paper
if (out == true) break;
} //for X
if (out == true) break;
x = 0;
} //for Y
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cnt = 0;
for (int i = 1; i < 6; i++) paper_cnt[i] = 5; //색종이 갯수 넣기
for (int Y = 0; Y < 10; Y++) {
for (int X = 0; X < 10; X++) {
scanf("%d", &paper[Y][X]);
//cin >> paper[Y][X];
if (paper[Y][X] == 1) cnt++;
}
}
ans = 40;
dfs(0, 0, 0, 0);
if (ans == 40)
printf("-1");
//cout << "-1";
else
printf("%d",ans);
//cout << ans;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
반응형
'알고리즘 문제풀기 > 백준' 카테고리의 다른 글
[백준][BOJ][C++][14891번] 톱니바퀴 (0) | 2021.03.15 |
---|---|
[백준][BOJ][C++][JAVA][2156번] 포도주 시식 (0) | 2021.03.13 |
[백준][BOJ][C++][17135번] 캐슬 디펜스 (0) | 2019.07.23 |
[백준][BOJ][C++][17144번] 미세먼지 안녕! (0) | 2019.07.19 |
[백준][BOJ][C++][17281번] 야구 (0) | 2019.07.16 |