코드와이
[BAEKJOON] 17136. 색종이 붙이기 본문
★★백트래킹★★
문제링크
17136번: 색종이 붙이기
<그림 1>과 같이 정사각형 모양을 한 다섯 종류의 색종이가 있다. 색종이의 크기는 1×1, 2×2, 3×3, 4×4, 5×5로 총 다섯 종류가 있으며, 각 종류의 색종이는 5개씩 가지고 있다. <그림 1> 색종이를 크
www.acmicpc.net
package acmicpc.Gold2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 색종이_붙이기 {
static int[][] arr;
static int ans = 987654321;
static int[] pages = {0,5,5,5,5,5};
static void backtracking(int cnt) {
int sr = -1, sc = -1;
out:for(int i = 0 ; i < 10 ; i++) {
for(int j = 0 ; j < 10 ; j++) {
if(arr[i][j] == 1) {
sr = i; sc = j;
break out;
}
}
}
// 더 이상 1이 없다.
if(sr == -1 && sc == -1) {
ans = Math.min(ans, cnt);
return;
}
int max = 5;
while(max > 0) {
boolean flag = true;
out:for(int i = 0 ; i < max ; i++) {
for(int j = 0 ; j < max ; j++) {
if( sr + i >= 10 || sc + j >= 10 || arr[sr + i][sc + j] == 0) {
flag = false;
break out;
}
}
}
// 붙일 수 있는 최대 크기를 구했으니 탈출!
if( flag ) break;
max--;
}
for(int i = 1 ; i <= max ; i++) {
if(pages[i] == 0) continue;
for(int r = sr ; r < sr + i ; r++) {
for(int c = sc ; c < sc + i ; c++) {
arr[r][c] = 0;
}
}
pages[i]--;
backtracking(cnt + 1);
for(int r = sr ; r < sr + i ; r++) {
for(int c = sc ; c < sc + i ; c++) {
arr[r][c] = 1;
}
}
pages[i]++;
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
arr = new int[10][10];
for(int i = 0 ; i < 10 ; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0 ; j < 10 ; j++)
arr[i][j] = Integer.parseInt(st.nextToken());
}
backtracking(0);
System.out.println(ans == 987654321 ? -1 : ans);
}
}
'acmicpc' 카테고리의 다른 글
[BAEKJOON] 2579. 계단 오르기 (0) | 2021.02.19 |
---|---|
[BAEKJOON] 2606. 바이러스 (0) | 2021.02.19 |
[BAEKJOON] 2193. 이친수 (0) | 2021.02.19 |
[BAEKJOON] 11726. 2xn 타일링 (0) | 2021.02.18 |
[BAEKJOON] 11399. ATM (0) | 2021.02.18 |