[SWEA] 보호 필름
Date:
[SWEA] 보호 필름
Problem URL : 보호 필름
#include <iostream>
#include <cstring>
int film[13][20];
int d, w, k;
int answer;
bool check() {
for (int W = 0; W < w; W++) {
int sum ;
for (int D = 0; D < d; D++) {
if (D == 0 || (film[D][W] != film[D - 1][W])) {
if ((d - D) < k) {
// 하나의 열이라도 통과하지 못하면 false
return false;
}
sum = 1;
} else {
sum++;
if (sum >= k) {
break;
}
}
}
}
return true;
}
bool dfs(int D, int count) {
if (D >= d && count != 0) {
return false;
}
if (count == 0) {
return check();
}
// D행 데이터를 임시 저장
int tmpRow[20];
for (int W = 0; W < w; W++) {
tmpRow[W] = film[D][W];
}
// D행을 0으로 색칠
for (int W = 0; W < w; W++) {
film[D][W] = 0;
}
if (dfs(D + 1, count - 1)) {
return true;
}
// D행을 1으로 색칠
for (int W = 0; W < w; W++) {
film[D][W] = 1;
}
if (dfs(D + 1, count - 1)) {
return true;
}
// D행을 아무것도 안하고 건너뜀
for (int W = 0; W < w; W++) {
film[D][W] = tmpRow[W];
}
if (dfs(D + 1, count)) {
return true;
}
return false;
}
int main() {
int TC;
scanf("%d", &TC);
for (int tc = 1; tc <= TC; tc++) {
scanf("%d %d %d", &d, &w, &k);
for (int D = 0; D < d; D++) {
for (int W = 0; W < w; W++) {
scanf("%d", &film[D][W]);
}
}
answer = k;
if (k != 1) {
for (int i = 0; i < k; i++) {
if (dfs(0, i)) {
answer = i;
break;
}
}
} else {
answer = 0;
}
printf("#%d %d\n", tc, answer);
}
return 0;
}
댓글