본문 바로가기
삼성 코팅테스트 준비/모의 역량 테스트 문제

5656 벽돌깨기

by tryotto 2020. 3. 2.
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <memory>
 
using namespace std;
 
int arr[20][20];
int min_rst;
int n, w, h;
 
void dfs_ball(int num, int depth);
void dfs_block(int y, int x);
void normalize();
int count_block();
int tmp_count_block();
 
int main() {
    int t;
    scanf("%d"&t);
 
    for (int i = 1; i <= t; i++) {
        memset(arr, 0sizeof(arr));
        min_rst = 10000000000;                
        scanf("%d %d %d"&n, &w, &h);
 
        for (int j = 1; j <= h; j++
            for (int k = 1; k <= w; k++)
                scanf("%d"&arr[j][k]);
                
        for (int j = 1; j <= w; j++
            dfs_ball(j, 1);
        
        printf("#%d %d\n", i, min_rst);
    }
}
 
void dfs_ball(int num, int depth) {        
    
    if (depth > n) {
        int tmp_rst = count_block();
 
        if (min_rst > tmp_rst)
            min_rst = tmp_rst;
    }
    else {
        int tmp_arr[20][20];
        memcpy(tmp_arr, arr, sizeof(arr));
 
        for (int i = h; i >= 0; i--
            if (arr[i][num] == 0) {                
                dfs_block(i + 1, num);
                break;
            }
        
        normalize();
 
        for (int i = 1; i <= w; i++
            dfs_ball(i, depth + 1); 
        
        memcpy(arr, tmp_arr, sizeof(tmp_arr));
    }
}
 
void dfs_block(int y, int x) {
    int power = arr[y][x] - 1;
    arr[y][x] = 0;
 
    for (int i = x - power; i <= x + power; i++) {
        if (i <= 0 || i > w)
            continue;
 
        if (arr[y][i] > 1)
            dfs_block(y, i);
        else
            arr[y][i] = 0;
    }
 
    for (int i = y - power; i <= y + power; i++) {
        if (i <= 0 || i > h)
            continue;
 
        if (arr[i][x] > 1)
            dfs_block(i, x);
        else
            arr[i][x] = 0;
    }
}
 
void normalize() {
    int tmp_arr[20][20= { 0 };
 
    for (int i = 1; i <= w; i++) {    
        int idx = h;
        for (int j = h; j >= 1; j--) {
            if (arr[j][i] > 0) {
                tmp_arr[idx][i] = arr[j][i];
 
                idx--;
            }    
        }
    }
 
    memcpy(arr, tmp_arr, sizeof(tmp_arr));
}
 
int count_block() {
    int cnt = 0;
    for (int i = 1; i <= h; i++) {
        for (int j = 1; j <= w; j++) {
            if (arr[i][j] > 0)
                cnt++;
        }
    }
 
    return cnt;
}
 
int tmp_count_block() {
    int cnt = 0;
    for (int i = 1; i <= h; i++) {
        for (int j = 1; j <= w; j++) {        
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
 
    return cnt;
}
cs


아오 머리아퍼

그래도 제 시간 안에는 풀었네


'삼성 코팅테스트 준비 > 모의 역량 테스트 문제' 카테고리의 다른 글

시간초과) 5653 줄기세포 배양  (0) 2020.03.03
5658 보물상자 비밀번호  (0) 2020.03.02
5644 무선충전  (0) 2020.03.02
4008 숫자만들기  (0) 2020.01.16
1952 수영장  (0) 2020.01.16