https://www.acmicpc.net/problem/17136
로직의 시간복잡도는 정확히 가늠하기 어려우나 의 배열 내에서 색종이를 붙이는 모든 경우의 수를 다 구하므로 사실상 상수 시간에 가깝다. 따라서 제한 조건 1초를 무난히 통과한다.
import static java.lang.Integer.MAX_VALUE;
import static java.lang.Integer.parseInt;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] matrix = new int[10][10];
static int[] papers = {0, 5, 5, 5, 5, 5};
static int ans = MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int r = 0; r < 10; r++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int c = 0; c < 10; c++) {
matrix[r][c] = parseInt(st.nextToken());
}
}
dfs(0, 0, 0);
System.out.println(ans == MAX_VALUE ? -1 : ans);
br.close();
}
static boolean canAttach(int r, int c, int size) {
for (int row = r; row < r + size; row++) {
for (int col = c; col < c + size; col++) {
if (row < 0 || row >= 10 || col < 0 || col >= 10) {
return false;
}
if (matrix[row][col] != 1) {
return false;
}
}
}
return true;
}
static void attach(int r, int c, int size, int value) {
for (int row = r; row < r + size; row++) {
for (int col = c; col < c + size; col++) {
matrix[row][col] = value;
}
}
}
static void dfs(int r, int c, int count) {
if (r == 9 && c > 9) {
ans = Math.min(ans, count);
return;
}
if (ans <= count) {
return;
}
if (c > 9) {
dfs(r + 1, 0, count);
return;
}
if (matrix[r][c] == 1) {
for (int size = 5; size >= 1; size--) {
if (papers[size] == 0 || !canAttach(r, c, size)) {
continue;
}
attach(r, c, size, size);
papers[size]--;
dfs(r, c + 1, count + 1);
attach(r, c, size, 1);
papers[size]++;
}
} else {
dfs(r, c + 1, count);
}
}
}