문제
17136번: 색종이 붙이기 (acmicpc.net)
해결방법
동작과정
- 종이의 왼쪽 맨 위 부터 탐색을 시작한다.
- 현재 탐색중인 위치가 1이면 크기가 5부터 1까지인 색종이 중 붙일 수 있으면 붙이고 다음 탐색을 수행한다.
- 큰거 부터 붙여보는 이유는 그리디한 방법으로 5부터 붙이면 더 빨리 최솟값을 찾아 가지치기를 수행할 수 있지 않을까 하는 생각
- 각 크기의 색종이는 5번만 사용해야 하므로
papers
를 통해 사용 횟수를 검사한다.
- 현재 위치 탐색이 끝나면 오른쪽을 탐색하고 맨 오른쪽까지 오면 다음 줄을 탐색한다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
private static int result = Integer.MAX_VALUE;
private static int[][] map;
private static int[] papers;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
map = new int[10][10];
for (int i = 0; i < 10; i++) {
StringTokenizer st = new StringTokenizer(in.readLine());
for (int j = 0; j < 10; j++)
map[i][j] = Integer.parseInt(st.nextToken());
}
papers = new int[6];
find(0, 0, 0);
out.write(result == Integer.MAX_VALUE ? "-1" : result+"");
out.flush();
}
private static void find(int y, int x, int cnt) {
if(cnt >= result)
return;
if(y == 9 && x == 10)
result = Math.min(cnt, result);
if(x == 10) {
find(y+1, 0, cnt);
return;
}
if(map[y][x] == 1) {
for(int size = 5; size > 0; size--) {
if(papers[size] < 5 && canUseSize(map, y, x, size)) {
papers[size]++;
setMap(map, y, x, size, 0);
find(y, x, cnt+1);
setMap(map, y, x, size, 1);
papers[size]--;
}
}
}
else {
find(y, x+1, cnt);
}
}
private static boolean canUseSize(int[][] map, int y, int x, int size) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (!isInBound(i + y, j + x) || map[i + y][j + x] == 0) {
return false;
}
}
}
return true;
}
private static void setMap(int[][] map, int y, int x, int size, int value) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
map[y + i][x + j] = value;
}
}
}
private static boolean isInBound(int y, int x) {
return x >= 0 && x < 10 && y >= 0 && y < 10;
}
}