Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

개발자 일기장.

백준 17136. 색종이 붙이기 본문

취업/Algorithm.

백준 17136. 색종이 붙이기

Azderica 2020. 3. 22. 02:52

색종이 붙이기

 


Problem?

문제.

 

Solution

브루트 포스

dfs를 통한 탐색

색종이 크기안에 빈칸(0)이 있는 경우나 색종이를 잘 붙인 경우는 효율적으로 다음 dfs를 설정한다.

 

가정

dfs() : 갈 수 있는 경로 탐색

 

board : 맵

confetti : 남은 색종이 파악

answer : 최소 경우의 답 보관



Code

#include	<iostream>
#include	<algorithm>
using namespace std;

#define MAX 10
#define INF 999999999

int board[MAX][MAX];					// map
int confetti[6] = { 0, 5, 5, 5, 5, 5 };	// confetti count(count per paper)
int answer = INF, cnt = 0;					// answer

void dfs(int y, int x){
	// if line is end
	if (x == MAX) {
		dfs(y + 1, 0);
		return;
	}
	// end state
	if (y == MAX) {
		answer = min(answer, cnt);
		return;
	}
	// if board is empty, check the next position
	if (board[y][x] == 0) {
		dfs(y, x + 1);
		return;
	}

	// check all possibility (loop : len 5 -> 1)
	for (int l = 5; l >= 1; l--) {
		if (confetti[l] == 0 || y + l > MAX || x + l > MAX)
			continue;
		
		bool flag = false;
		for (int i = y; i < y + l; i++){
			for (int j = x; j < x + l; j++){
				if (board[i][j] == 0) {
					flag = true;
					break;
				}
			}
			if (flag == true)
				break;
		}
		if (flag == true)
			continue;

		confetti[l]--;
		cnt++;
		for (int i = y; i < y + l; i++)
			for (int j = x; j < x + l; j++)
				board[i][j] = 0;

		// efficient way
		dfs(y, x + l);

		for (int i = y; i < y + l; i++)
			for (int j = x; j < x + l; j++)
				board[i][j] = 1;
		cnt--;
		confetti[l]++;
	}
}

int main() {
	// input
	for (int i = 0; i < MAX; i++)
		for (int j = 0; j < MAX; j++)
			scanf("%d", &board[i][j]);

	// solution
	dfs(0, 0);
	if (answer == INF)
		answer = -1;

	// output
	cout << answer << "\n";

	return 0;
}

 


 

'취업 > Algorithm.' 카테고리의 다른 글

[2020 카카오 공채] 블록 이동하기  (0) 2020.03.22
[2020 카카오 공채] 문자열 압축  (0) 2020.03.22
백준 1525. 퍼즐  (0) 2020.03.22
백준 4386. 별자리 만들기  (0) 2020.03.16
백준 1647. 도시 분할 계획  (0) 2020.03.16