10 x 10 크기에 색종이를 최소 개수로 붙여야 한다.
1 부분에 색종이를 붙이는 것이기에 붙였다면 그 사이즈만큼 0으로 처리해서 더 이상 보지 않는다
java fill(n, m, i, 0); // 1을 0으로 채우기
당연스럽게도 0으로 채운 부분은 다음 턴 때 다시 봐야 하기에 1로 복구 시켜야한다.
import java.io.*;
import java.util.*;
public class Main{
public static int[][] board = new int[12][12];
public static int[] paperCount = {0, 5, 5, 5, 5, 5};
public static int res = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
for(int i = 0; i < 10; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0; j < 10; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
func(0, 0);
if(res == Integer.MAX_VALUE) System.out.println(-1);
else System.out.println(res);
}
private static void func(int loc, int cnt) {
if (loc == 100) {
res = Math.min(res, cnt);
return;
}
if (res <= cnt) return;
int n = loc % 10;
int m = loc / 10;
if(board[n][m] == 1) {
for(int i = 5; i >= 1; i--) {
if(paperCount[i] > 0 && check(n, m, i)) {
paperCount[i]--;
fill(n, m, i, 0); // 1을 0으로 채우기
func(n * m + 1, cnt + 1);
fill(n, m, i, 1); // 0으로 채웠던 부분 다시 1로 복구
paperCount[i]++;
}
}
} else {
func(loc + 1, cnt);
}
}
private static boolean check(int n, int m, int num) {
if(n + num > 10 || m + num > 10) return false;
for (int i = n; i < n + num; i++) {
for (int j = m; j < m + num ; j++) {
if(board[i][j] == 0) return false;
}
}
return true;
}
private static void fill(int n, int m, int num, int k) {
for(int i = n; i < n + num; i++) {
for(int j = m; j < m + num; j++) {
board[i][j] = k;
}
}
}
}