Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- C
- 줄 세우기
- RVO
- C++
- Programmers
- Unreal Engine5
- RootMotion
- UnrealEngine5
- softeer
- 백준
- 프로그래머스
- algorithm
- 언리얼엔진5
- 오블완
- UnrealEngine4
- 1563
- baekjoon
- UE5
- 2294
- NRVO
- IFileDialog
- GeeksForGeeks
- 티스토리챌린지
- const
- Frustum
- DeferredRendering
- DirectX11
- winapi
- 팰린드롬 만들기
- directx
Archives
- Today
- Total
Game Develop
[Algorithm] Baekjoon 18500번 : 미네랄 2 본문
https://www.acmicpc.net/problem/18500
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
struct Node
{
int y;
int x;
};
int r, c, n;
char arr[101][101] = { 0 };
int dir[4][2] = { {0,-1},{0,1},{-1,0},{1,0} }; // 좌, 우, 상,하
int throwInfo[101] = { 0 };
int visited[101][101] = { 0 };
vector<Node> prevAddedNodes;
bool cmp(const Node& a, const Node& b) // y가 클수록 땅에 가까움
{
return a.y > b.y;
}
bool isGroundCluster(int startY, int startX, int mark)
{
// 1,2,3,4 == 좌,우,상,하 표시.
queue<Node> q;
q.push({ startY,startX });
visited[startY][startX] = mark;
prevAddedNodes.push_back({ startY,startX });
while (!q.empty())
{
int curY = q.front().y;
int curX = q.front().x;
q.pop();
if (curY == r-1 || (visited[curY][curX] >= 1 && visited[curY][curX] != mark)) // 이게 가능한 이유는, 만약 낙하될 클러스터에 대한 탐색이면
{ // 이후 이 함수를 수행 안한다는게 보장되어지기 때문.
return true;
}
for (int i = 0; i < 4; ++i)
{
int nextY = curY + dir[i][0];
int nextX = curX + dir[i][1];
if (nextY < 0 || nextY >= r) continue;
if (nextX < 0 || nextX >= c) continue;
if (visited[nextY][nextX] == mark) continue; // 자기꺼면 탐색x.
if (visited[nextY][nextX] >= 1) return true; // 자기꺼 아닌데 이미 표시되어있다면 -> 이전에 땅이랑 연결된 방향탐색노드들.
if (arr[nextY][nextX] != 'x') continue; // 'x'값이여야만 함. x를 탐색하는거니까
// 즉, 'x'면서 아직 탐색안한거
visited[nextY][nextX] = mark;
q.push({ nextY,nextX });
prevAddedNodes.push_back({ nextY,nextX });
}
}
return false;
}
void DestroyMineral(int targetY, int isRight)
{
memset(visited, 0, sizeof(visited));
if (targetY == 5)
{
int asfd = 0;
}
Node startNode = { -1,-1 };
if (isRight == 0)
{
for (int i = 0; i < c; ++i)
{
if (arr[targetY][i] == 'x')
{
startNode.y = targetY;
startNode.x = i;
arr[targetY][i] = '.'; // 부수고
break;
}
}
}
else
{
for (int i = c - 1; i >= 0; --i)
{
if (arr[targetY][i] == 'x')
{
startNode.y = targetY;
startNode.x = i;
arr[targetY][i] = '.'; // 부수고
break;
}
}
}
if (startNode.y == -1) return; // 허공에 던진거면
for (int i = 0; i < 4; ++i) // 좌,우,상,하,
{
if (i == isRight) continue;
prevAddedNodes.clear();
int startY = startNode.y + dir[i][0];
int startX = startNode.x + dir[i][1];
if (startY < 0 || startY >= r) continue;
if (startX < 0 || startX >= c) continue;
if (arr[startY][startX] == '.') continue;
bool check = isGroundCluster(startY, startX, i + 1);
if (!check) // 땅에붙어있는거 아니면 == 낙하할덩어리면 더이상 탐색 무의미.
{
// 땅에 가까운순으로 정렬.
sort(prevAddedNodes.begin(), prevAddedNodes.end(), cmp);
while (1)
{
bool isCheck = true;
vector<Node> temp;
for (int i = 0; i < prevAddedNodes.size(); ++i)
{
int curY = prevAddedNodes[i].y;
int curX = prevAddedNodes[i].x;
if (curY + 1 == r || arr[curY + 1][curX] == 'x')
{
isCheck = false;
break;
}
else
{
arr[curY][curX] = '.';
arr[curY + 1][curX] = 'x';
temp.push_back({ curY + 1,curX }); // 변경한거 저장.
}
}
if (!isCheck) // 전부 한칸씩 땅으로 땡기는게 불가능하면 원상복귀
{
for (int i = 0; i < temp.size(); ++i)
{
int curY = temp[i].y;
int curX = temp[i].x;
arr[curY][curX] = '.';
}
for (int i = 0; i < prevAddedNodes.size(); ++i)
{
int curY = prevAddedNodes[i].y;
int curX = prevAddedNodes[i].x;
arr[curY][curX] = 'x';
}
break;
}
else
{
prevAddedNodes = temp;
}
}
break;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> r >> c;
for (int i = 0; i < r; ++i)
{
for (int j = 0; j < c; ++j)
{
cin >> arr[i][j];
}
}
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> throwInfo[i];
DestroyMineral(r - throwInfo[i], i%2);
}
for (int i = 0; i < r; ++i)
{
for (int j = 0; j < c; ++j)
{
printf("%c", arr[i][j]);
}
printf("\n");
}
}
|
cs |
내 바로 이전글인 '미네랄'과 코드, 풀이가 완전 동일하다.
https://maxlevel-trace.tistory.com/425
다른 점이 있다곤 하는데, 애초에 내가 미네랄을 풀 때 대부분의 경우에 대해 되게 코드를 짰더니 미네랄 2도 그냥 통과한다.
'Algorithm > Baekjoon' 카테고리의 다른 글
[Algorithm]Baekjoon 14466번 :: 소가 길을 건너간 이유 6 (0) | 2023.05.09 |
---|---|
[Algorithm]Baekjoon 1800번 :: 인터넷 설치 (0) | 2023.05.09 |
[Algorithm] Baekjoon 2933번 : 미네랄 (0) | 2023.05.06 |
[Algorithm] Baekjoon 1799번 : 비숍 (0) | 2023.05.03 |
[Algorithm] Baekjoon 3197번 : 백조의 호수 (0) | 2023.05.03 |