본문 바로가기
백준/[삼성 기출]

[17136번] 색종이 붙이기

by 2744m 2020. 4. 11.
17136번: 색종이 붙이기
 
www.acmicpc.net


1*1, 2*2, 3*3, 4*4, 5*5 크기의 색종이가 각각 5장 씩 주어진다.


이 색종이들 만 이용해서 주어진 공간에 완벽하게 붙이면 된다.


조건

1. 색종이를 붙일 때는 종이의 경계 밖으로 나가서는 안된다.

2. 겹쳐도 안 된다.

3. 칸의 경계와 일치하게 붙여야 한다. 즉, 0이 적힌 칸에는 색종이가 있으면 안 된다.


맵의 크기가 10*10으로 작기 때문에 완전탐색으로 해결할 수 있다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
struct pnt { int r, c; };
int map[10][10];
vector<pnt>one; //맵에서 주어지는 1의 위치
int oneVisit[100];
int Paper[6= { 0,5,5,5,5,5 };
int oneCnt;
int ans = 987654321;
 
bool rangeChk(int r, int c) {
    if (!(r < 0 || c < 0 || r >= 10 || c >= 10)) return true;
    return false;
}
 
void dfs(int dep) {
    int r = -1, c = -1;
    for (register int i = 0; i < one.size(); i++) {
        if (map[one[i].r][one[i].c] == 1) {
            r = one[i].r;
            c = one[i].c;
            break;
        }
    }
    if (r == -1 && c == -1) {
        ans = min(ans, dep);
        return;
    }
    int size = 5;
    while (size > 0) {
        if (rangeChk(r + size-1, c + size-1)) {
            break;
        }
        size--;
    }
 
    for (int s = size; s > 0; s--) {
        if (Paper[s] == 0continue;
        bool OK = true;
        for (int rr = r; rr < r + s; rr++) {
            for (int cc = c; cc < c + s; cc++) {
                if (map[rr][cc] != 1) {
                    OK = false;
                    break;
                }
            }
        }
        if (!OK) continue;
        for (int rr = r; rr < r + s; rr++) {
            for (int cc = c; cc < c + s; cc++) {
                map[rr][cc] = -1;
            }
        }
        Paper[s]--;
        dfs(dep + 1);
        Paper[s]++;
        for (int rr = r; rr < r + s; rr++) {
            for (int cc = c; cc < c + s; cc++) {
                map[rr][cc] = 1;
            }
        }
    }
}
 
 
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    for (int r = 0; r < 10; r++) {
        for (int c = 0; c < 10; c++) {
            cin >> map[r][c];
            if (map[r][c] == 1) one.push_back({ r,c });
        }
    }
    oneCnt = one.size();
    dfs(0);
    if (ans == 987654321) ans = -1;
    cout << ans;
    return 0;
}
cs

'백준 > [삼성 기출]' 카테고리의 다른 글

[12100번] 2048(Easy)  (0) 2020.04.21
[17406번] 배열 돌리기4  (0) 2020.04.11
[17471번] 게리맨더링  (0) 2020.04.11
[17472번] 다리 만들기2  (0) 2020.04.11
[3190번] 뱀  (0) 2020.04.04

댓글