16236 ์๊ธฐ์์ด ๐ฆ
๊ฐ์ธ์ ์ผ๋ก ๋ง์ด ์ด๋ ค์ ๋ ๋ฌธ์ !
-> ์๊ณ ๋ณด๋ ๋ฌธ์ ๋ฅผ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ ๋ฌธ์ ..
- ํ์ฌ ์์ด ์์น์์๋ถํฐ ๋ฌผ๊ณ ๊ธฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค
- ๋จ, ์์ด๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ๋ ์ง๋๊ฐ ์ ์๋ค.
- ๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๋ค์ ๊ณ ๋ฅธ๋ค.
- 0๋ณด๋ค ํฌ๊ณ ์์ด์ ํฌ๊ธฐ๋ณด๋ค๋ ์์์ผํ๋ค.
- ๊ณ ๋ฅธ ๋ฌผ๊ณ ๊ธฐ ์ค ๊ฐ์ฅ ์์ชฝ์ ์๋(๊ฐ์ผ๋ฉด ์ผ์ชฝ์ ์๋) ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๊ณจ๋ผ์ ๋จน๋๋ค.
- ํ์ฌ ์์ด์ ์์น๋ 0์ผ๋ก ํ๊ณ ๋จน์ ๋ฌผ๊ณ ๊ธฐ์ ์์น์ ์์ด(9)๋ฅผ ๋๋ค.
- ์์ด๊ฐ ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์๋ฅผ ์ฆ๊ฐ์ํค๊ณ ๋ง์ฝ ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์๊ฐ ์์ด์ ํฌ๊ธฐ์ ๊ฐ๋ค๋ฉด ์์ด์ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
- ๊ณ ๋ฅธ ๋ฌผ๊ณ ๊ธฐ์ ์์ด ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋งํผ ์๊ฐ์ ์ฆ๊ฐ์ํจ๋ค.
๋๋ ์ ๋ก์ง์ ๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์๋๊น์ง ๋ฐ๋ณต์์ผ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
2%์์ ์๊พธ ์๊ฐ์ด๊ณผ๊ฐ ๋์ ์์ธ์ง ์์๋ณด๋ ์์ดํฌ๊ธฐ๊ฐ 9 ์ด์์ด ๋๋ฉด ๋ฌดํ๋ฃจํ์ ๊ฑธ๋ฆฌ๋ ๊ฒ์ด์๋ค. ๊ทธ๋์ 76์งธ ์ค์ ์์ด ํฌ๊ธฐ๊ฐ 7 ์ด์ ๋์ง ์๋๋ก ์ถ๊ฐํ๋ค.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int N;
void initVisited(vector<vector<bool>> &visited) {
visited.clear();
for (int i = 0; i < N; i++) {
vector<bool> tmp(N,false);
visited.push_back(tmp);
}
}
int main() {
cin >> N;
vector<vector<int>> sea(N);
pair<int, int> shark; //์์ด ์์น
for (int i = 0; i < N; i++) { //์
๋ ฅ
for (int k = 0; k < N; k++) {
int input; cin >> input;
sea[i].push_back(input);
if (input == 9) {
shark = { i,k };
}
}
}
int sharkSize = 2; //์์ด ํฌ๊ธฐ
int eated = 0; //๋จน์ ๋ฌผ๊ณ ๊ธฐ ์
int totalTime = 0;
int dx[] = { 0,1,0,-1 };
int dy[] = { -1,0,1,0 };
vector<vector<int>> canEat; //๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ
do {
canEat.clear();
int minDist = 5000; //canEat์ ๋ค์ด๊ฐ ์ ์๋ ๊ฑฐ๋ฆฌ
queue<vector<int>> q; //x,y,๊ฑฐ๋ฆฌ
vector<vector<bool>> visited(N, vector<bool>(N, false));
q.push({ shark.first,shark.second,0 });
visited[shark.first][shark.second] = true;
while (!q.empty()) {
vector<int> now = q.front(); q.pop();
if (now[2] > minDist) continue;
if (0 < sea[now[0]][now[1]] && sea[now[0]][now[1]] < sharkSize) {
if (now[2] < minDist) {
minDist = now[2];
canEat.clear();
canEat.push_back(now);
}
else if (now[2] == minDist) {
canEat.push_back(now);
}
}
for (int i = 0; i < 4; i++) {
int xx = now[0] + dx[i];
int yy = now[1] + dy[i];
if (0 <= xx && xx < N && 0 <= yy && yy < N && !visited[xx][yy]) {
if (sea[xx][yy] <= sharkSize) {
visited[xx][yy] = true;
q.push({ xx,yy,now[2] + 1 });
}
}
}
}
if (canEat.size() > 0) {
sort(canEat.begin(), canEat.end());
vector<int> togo = canEat[0];
sea[shark.first][shark.second] = 0;
sea[togo[0]][togo[1]] = 9;
shark = { togo[0],togo[1] };
totalTime += togo[2];
eated++;
if (eated == sharkSize) {
sharkSize++;
if (sharkSize >= 7) {
sharkSize = 7;
}
eated = 0;
}
}
} while (!canEat.empty());
cout << totalTime << endl;
return 0;
}