Notice
Recent Posts
Link
정화 코딩
[C++] 아기 상어 (백준 16236번) 본문


https://www.acmicpc.net/problem/16236
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n, curs, cnt, time;
vector<vector<int>> m;
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
vector<int> targetf(int si, int sj) {
vector<vector<int>> vst(n, vector<int>(n, -1));
queue<pair<int, int>> q;
vector<vector<int>> fish;
q.emplace(si, sj);
vst[si][sj] = 0;
while (!q.empty()) {
int curi = q.front().first;
int curj = q.front().second;
q.pop();
if (m[curi][curj] > 0 && m[curi][curj] < curs) {
fish.push_back({vst[curi][curj], curi, curj}); // 걸리는 시간, x 좌표, y 좌표
}
for (int k = 0; k < 4; k++) {
int nxti = curi + dx[k];
int nxtj = curj + dy[k];
if (nxti >= 0 && nxti < n && nxtj >= 0 && nxtj < n && m[nxti][nxtj] <= curs && vst[nxti][nxtj] == -1) {
q.emplace(nxti, nxtj);
vst[nxti][nxtj] = vst[curi][curj] + 1;
}
}
}
if (fish.empty()) {
return {-1, -1, -1};
} else {
sort(fish.begin(), fish.end());
return fish[0];
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
m = vector<vector<int>>(n, vector<int>(n));
int curi, curj;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> m[i][j];
if (m[i][j] == 9) {
m[i][j] = 0;
curi = i;
curj = j;
}
}
}
curs = 2;
cnt = 0;
time = 0;
while (1) {
vector<int> f = targetf(curi, curj);
if (f[0] == -1) { // 더 이상 먹을 수 있는 물고기가 없을 때
cout << time << '\n';
return 0;
} else { // 먹을 수 있는 물고기가 하나라도 있을 때
time += f[0];
curi = f[1];
curj = f[2];
m[curi][curj] = 0;
cnt++;
if (cnt == curs) {
curs++;
cnt = 0;
}
}
}
}
그냥 bfs.. 구현... 문제였다. (AC)
'PS' 카테고리의 다른 글
[C++] 연구소 (백준 14502번) (2) | 2025.04.10 |
---|---|
[C++] 삼각형만들기 (백준 2622번) (0) | 2025.04.10 |
[C++] 건공문자열 (백준 30823번) (0) | 2025.04.06 |
[C++] 치킨 배달 (백준 15686번) (0) | 2025.04.04 |
[C++] 반복수열 (백준 2331번) (0) | 2025.04.04 |