반응형
이문제는 처음에 0.5초 마다 움직이는 코드로 작성하다 시초가 발생하여 1초마다 움직이는 걸로 처리해 주고 0,5초에서의 충돌을 로직을 하나 만들어 수행하였습니다. 또한
if (map[ny][nx].p > 0 && map[ny][nx].b == 0) {
if (dis_check(cur.dis, nx, ny)) { //0.5초에 충돌이 있으면 실행
ans += map[cur.y][cur.x].p;
map[cur.y][cur.x].dis = 0;
map[cur.y][cur.x].p = 0;
map[ny][nx].b = 1;
continue;
}
이부분에서
map[cur.y][cur.x].dis = 0;
map[cur.y][cur.x].p = 0;
map[ny][nx].b = 1;
이것을 넣어 주지 않아 계속 14개 정도만 맞추던 문제였습니다.
-1000,1000이상의 범위에서는 충돌이 잃어 나지 않느다고 생각하고
x.5초에서의 충돌을 먼저 계산해 주고 1x초에서의 충돌을 계산해 주었습니다.
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
#include<iostream>
#include<queue>
using namespace std;
struct q_info {
int x;
int y;
int dis;
int p;
};
struct {
int dis;
int p;
int b;
}map[2010][2010];
int ans;
int N, K, x, y, dis;
queue< q_info > q;
queue<q_info> c;
int set = 1002;
int p_x[4] = { 0,0,-1,1 };
int p_y[4] = { 1,-1,0,0 };
void init() {
ans = 0;
for (register int Y = 0; Y < 2010; Y++) {
for (register int X = 0; X < 2010; X++) {
map[Y][X].dis = 0;
map[Y][X].p = 0;
map[Y][X].b = 0;
}
}
while (!q.empty()) q.pop();
}
bool dis_check(int dis, int x, int y) { //0.5초에서 충돌하는지 확인해주는 로직
if (dis == 0) {
if (map[y][x].dis == 1)
return true;
}
if (dis == 1) {
if (map[y][x].dis == 0)
return true;
}
if (dis == 2) {
if (map[y][x].dis == 3)
return true;
}
if (dis == 3) {
if (map[y][x].dis == 2)
return true;
}
return false;
}
void go() {
int end;
while (1) {
if (q.empty() || q.size() == 1) break;
end = q.size();
for (register int qq = 0; qq < end; qq++) {//0.5초에서 충돌이 있다면 처리해주는 로직
q_info cur = q.front();
q.pop();
if (map[cur.y][cur.x].b == 1) { //충돌때문에 사라진 것이라 다시 q에 넣어주지 않음
map[cur.y][cur.x].b = 0;
ans += map[cur.y][cur.x].p;
map[cur.y][cur.x].p = 0;
map[cur.y][cur.x].dis = 0;
continue;
}
if (ny == 0 || ny == 2009 || nx == 0 || nx == 2009) {
map[cur.y][cur.x].dis = 0;
map[cur.y][cur.x].p = 0;
map[cur.y][cur.x].b = 0;
continue;
}
if (map[ny][nx].p > 0 && map[ny][nx].b == 0) {
ans += map[cur.y][cur.x].p;
map[cur.y][cur.x].dis = 0;
map[cur.y][cur.x].p = 0;
map[ny][nx].b = 1;
continue;
}
}
map[cur.y][cur.x].dis = 0;
map[cur.y][cur.x].p = 0;
map[cur.y][cur.x].b = 0;
q.push(cur);
}
end = q.size();
for (register int qq = 0; qq < end; qq++) { //0.5초 충돌을 모두 처리해 주고 시작
q_info cur = q.front();
q.pop();
if (ny == 0 || ny == 2009 || nx == 0 || nx == 2009) continue;
if (map[ny][nx].p > 0) { //무언가가 있다면
ans += cur.p;
map[ny][nx].b = 1;
q_info next;
next.x = nx;
next.y = ny;
c.push(next);
}
else { //아무것도 없다면
q_info next;
next.x = nx;
next.y = ny;
next.p = cur.p;
q.push(next);
map[next.y][next.x].b = 0;
map[next.y][next.x].p = cur.p;
map[next.y][next.x].dis = cur.dis;
}
}
end = c.size();
for (register int qq = 0; qq < end; qq++) { //충돌한 곳에 처음 들어간 원자는 위에서 처리해 주지 않았음으로 요기서 처리
q_info cur = c.front();
c.pop();
if (map[cur.y][cur.x].b == 1) { //충돌때문에 사라진 것이라 다시 q에 넣어주지 않음
ans += map[cur.y][cur.x].p;
map[cur.y][cur.x].p = 0;
map[cur.y][cur.x].dis = 0;
continue;
}
}
//cout << endl;
}//while
}
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", &N);//원자의 수 만큼
//cin >> N;
for (register int n = 1; n <= N; n++) {
scanf("%d %d %d %d", &x, &y, &dis, &K);
if (K == 0) continue;
int xx = set + x; int yy = set + y;
map[yy][xx].dis = dis;
map[yy][xx].p = K;
map[yy][xx].b = 0;
q_info INFO;
INFO.x = xx;
INFO.y = yy;
INFO.p = K;
INFO.dis = dis;
q.push(INFO);
}
go();
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++][2477번] 차량정비소 (0) | 2021.03.25 |
---|---|
[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][2382번] 미생물 격리 (0) | 2019.09.22 |
[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][5658번] 보물상자 비밀번호 (0) | 2019.08.09 |
[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][5650번] 핀볼 게임 (0) | 2019.08.08 |
[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][5644번] 무선 충전 (0) | 2019.08.06 |