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

시간초과) 5653 줄기세포 배양

by tryotto 2020. 3. 3.
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
#include <stdio.h>
#include <memory>
#include <string.h>
#include <utility>
 
using namespace std;
 
int dead = -10000000;
int cur[800][800];
int power[800][800];
int tmp_power[800][800];
int cen_x = 400, cen_y = 400;
int n, m, k;
 
int bfs();
void time_later();
void spread();
int count();
 
int main() {
    int t;
    scanf("%d"&t);
 
    for (int test = 1; test <= t; test++) {
        memset(cur, 0sizeof(cur));
        memset(power, 0sizeof(power));
        scanf("%d %d %d"&n, &m, &k);
 
        for (int i = 0; i < n; i++
            for (int j = 0; j < m; j++) {
                scanf("%d"&cur[cen_y + i][cen_x + j]);
                power[cen_y + i][cen_x + j] = cur[cen_y + i][cen_x + j];
            }
            
        int rst = bfs();
        printf("#%d %d\n", test, rst);
    }
}
 
void time_later() {
    for (int i = cen_y - k-1; i <= cen_y + n+k+1; i++) {
        for (int j = cen_x - k-1; j <= cen_x + m+k+1; j++) {
            if (cur[i][j] >= 1) {
                cur[i][j]--;
 
                if (cur[i][j] == 0)
                    cur[i][j] = - power[i][j];
            }
            else if ((cur[i][j] <= -1&& (cur[i][j] > dead)) {
                cur[i][j]++;
 
                if (cur[i][j] == 0)
                    cur[i][j] = dead;
            }
        }
    }
}
 
int bfs() {
    for (int i = 1; i <= k; i++) {        
        time_later();
 
        if (i == k)
            return count();
        
        spread();
    }
}
 
int count() {
    int cnt = 0;
    for (int i = cen_y - k - 1; i <= cen_y + n + k + 1; i++
        for (int j = cen_x - k - 1; j <= cen_x + m + k + 1; j++
            if (cur[i][j] != 0 && cur[i][j] != dead)
                cnt++;
        
    return cnt;
}
 
void spread() {
    int _dx[4= { 1,-1,0,0 };
    int _dy[4= { 0,0,1,-1 };
    
    memcpy(tmp_power, power, sizeof(power));
    
    for (int i = cen_y - k - 1; i <= cen_y + n + k + 1; i++
        for (int j = cen_x - k - 1; j <= cen_x + m + k + 1; j++
            if ((cur[i][j] <= -1&& (cur[i][j] > dead)) {
                for (int idx = 0; idx < 4; idx++) {
                    int dx = _dx[idx];
                    int dy = _dy[idx];
 
                    if (power[i + dy][j + dx] == 0) {
                        if (cur[i + dy][j + dx] < power[i][j] + 1) {
                            cur[i + dy][j + dx] = power[i][j] + 1;                            
                            tmp_power[i + dy][j + dx] = power[i][j];
                        }
                    }
                }
            }
 
    memcpy(power, tmp_power, sizeof(tmp_power));
}
cs


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

2115 벌꿀채취  (0) 2020.03.03
4012 요리사  (0) 2020.03.03
5658 보물상자 비밀번호  (0) 2020.03.02
5656 벽돌깨기  (0) 2020.03.02
5644 무선충전  (0) 2020.03.02