Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Tags
more
Archives
Today
Total
관리 메뉴

코드와이

[BAEKJOON] 17136. 색종이 붙이기 본문

acmicpc

[BAEKJOON] 17136. 색종이 붙이기

코드와이 2021. 2. 19. 16:49

 

백트래킹

문제링크

www.acmicpc.net/problem/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