반응형
이 문제는 문제를 이해하지 못해 고생을 했습니다. 문제를 풀때 문제를 잘 읽어야 한다는 것을 다시 한번 느낄수 있었습니다. 제가 똑바로 읽지 않은 부분은
초기 상태에서 줄기 세포들은 비활성 상태이며 생명력 수치가 X인 줄기 세포의 경우 X시간 동안 비활성 상태이고 X시간이 지나는 순간 활성 상태가 된다.
줄기 세포가 활성 상태가 되면 X시간 동안 살아있을 수 있으며 X시간이 지나면 세포는 죽게 된다.
이 부분으로 저는 번식된 줄기 세포는 비활성 상태이다 이것 때문에 번식된 줄기세포를 비활성상태가 아닌 죽은 상태로 계산하여 틀렸습니다.
문제의 접근방법은 bfs를 통해 풀었고 생명력은 10이하이고 제한시간은 300시간 이하이기 때문에 범위가 정해지지 않았지만 넉넉하게 700*700짜리 배열을 만들어 시작을 400,400에서 시작하게 하여 해결하였습니다.
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
131
132
133
134
135
136
137
138
139
140
141
142
143
|
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct {
int life_time;
int v;
int check;
}room[800][800];
struct info {
int x;
int y;
int time_fix;
int time_change;
int die;
};
int N, M, K;
int ans;
int p_x[4] = { 1,0,-1,0 };
int p_y[4] = { 0,1,0,-1 };
queue<info>cell;
queue<info>cell_temp;
void init() {
ans = 0;
for (register int Y = 0; Y < 800; Y++) {
for (register int X = 0; X < 800; X++) {
room[Y][X].life_time = 0;
room[Y][X].v = 0;
room[Y][X].check = 0;
}
}
cell.pop();
}
cell_temp.pop();
}
}
void func() {
while (K--) { //K 시간만큼
int end = cell.size();
for (register int i = 0; i < end; i++) {
info cur = cell.front();
cell.pop();
}
}
else {
room[cur.y][cur.x].v = 1;
}
}
end = cell.size();
for (register int i = 0; i < end; i++) {
info cur = cell.front();
cell.pop();
cur.time_change--;
if (cur.time_change == 0) {
info aa;
}
for (int dis = 0; dis < 4; dis++) {
int nY = cur.y + p_y[dis];
int nX = cur.x + p_x[dis];
if (room[nY][nX].v == 0) { //차지하고 있는 줄기세포가 없을 때
if (room[nY][nX].life_time < cur.time_fix) {
room[nY][nX].life_time = cur.time_fix;
info next;
next.x = nX;
next.y = nY;
}
}
}
}
else {
}
}
int temp_end = cell_temp.size();
for (register int i = 0; i < temp_end; i++) {
info check = cell_temp.front();
cell_temp.pop();
if (room[check.y][check.x].check != 0) continue;
room[check.y][check.x].check = 1;
info next;
next.time_change = room[check.y][check.x].life_time;
next.time_fix = room[check.y][check.x].life_time;
next.x = check.x;
next.y = check.y;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int T;
scanf("%d", &T);
//cin >> T;
for (register int t = 1; t <= T; t++) {
init();
scanf("%d %d %d", &N, &M, &K);
//cin >> N >> M >> K;
for (register int Y = 400; Y <= 399 + N; Y++) {
for (register int X = 400; X <= 399 + M; X++) {
int time;
scanf("%d", &time);
time++;
if (time == 1) continue;
info INFO;
INFO.time_change = time;
INFO.time_fix = time;
INFO.x = X;
INFO.y = Y;
}
}
func();
ans = cell.size();
printf("#%d %d\n", t, ans);
//cout << "#" << t << " " << ans << endl;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
반응형
'알고리즘 문제풀기 > SWEA' 카테고리의 다른 글
[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][5644번] 무선 충전 (0) | 2019.08.06 |
---|---|
[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][5656번] 벽돌 깨기 (0) | 2019.08.05 |
[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][4008번] 숫자 만들기 (0) | 2019.08.04 |
[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][4012번] 요리사 (0) | 2019.08.02 |
[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][4013번] 특이한 자석 (0) | 2019.08.02 |