[๋ฐฑ์ค] 16236 ์๊ธฐ ์์ด DFS, Priority-Queue
๋ฌธ์ :
16236๋ฒ: ์๊ธฐ ์์ด
N×N ํฌ๊ธฐ์ ๊ณต๊ฐ์ ๋ฌผ๊ณ ๊ธฐ M๋ง๋ฆฌ์ ์๊ธฐ ์์ด 1๋ง๋ฆฌ๊ฐ ์๋ค. ๊ณต๊ฐ์ 1×1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ํ ์นธ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ต๋ 1๋ง๋ฆฌ ์กด์ฌํ๋ค. ์๊ธฐ ์์ด์ ๋ฌผ๊ณ ๊ธฐ๋ ๋ชจ๋ ํฌ๊ธฐ๋ฅผ ๊ฐ
www.acmicpc.net
๋ฌธ์ ์ค๋ช :
-> ์๊ธฐ ์์ด๊ฐ ๋ช์ด ๋์ ๋ฌผ๊ณ ๊ธฐ ์ก์๋จน์ ์ ์๋์ง ์ถ๋ ฅํ์์ค
๊ณต๊ฐ n = 4
- 0: ๋น ์นธ
- 1, 2, 3, 4, 5, 6: ์นธ์ ์๋ ๋ฌผ๊ณ ๊ธฐ์ ํฌ๊ธฐ
- 9: ์๊ธฐ ์์ด์ ์์น
์๊ธฐ ์์ด๊ฐ ์์ง์ผ ์ ์๋ ์กฐ๊ฑด
1. ์๊ธฐ ์ฃผ๋ณ์ ์ธ์ ํ ๋ฌผ๊ณ ๊ธฐ && ๋จน์ ์ ์๋ค๋ฉด ๊ฐ์ฅ ์ธ์ ํ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฌ ๊ฐ๋ค.
2. ์ธ์ ํ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ฌ๋ฌ ๋ง๋ฆฌ๋ผ๋ฉด ๊ฐ์ฅ ์์ ์๋ ๋ฌผ๊ณ ๊ธฐ, ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋ฌผ๊ณ ๊ธฐ ์์ผ๋ก ๋จน๋๋ค.
๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ ์กฐ๊ฑด
1. ์๊ธฐ ํฌ๊ธฐ๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ๋ง ๋จน์ ์ ์๋ค.
2. ์๊ธฐ ํฌ๊ธฐ๋ ์๊ธฐ ํฌ๊ธฐ ๋งํผ์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฉด 1 ์ฆ๊ฐํ๋ค.
๋ถ์ :
์์ด์ ์์ง์์ bfs๋ก ๋๊ณ q์์ {์ด๋ ๊ฑฐ๋ฆฌ, y, x}๋ก ๊ด๋ฆฌํ๋ค.
n x n ๋ฐฐ์ด์ bfs๋ก ํ์ํ๋ ๋์ ์์ด๊ฐ ๊ฐ ์ ์๋ ๊ณณ์ ๋ํด์๋ง q์ ๋ฃ์ผ๋ฉฐ
๋จน์ ์ ์์ผ๋ฉฐ 0์ด ์๋ ์นธ์ ๋ํด pq (๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ ๋ฐฐ์ด) + (๊ทธ๋ฐ๋ฐ ์์ด๊ฐ ๋จน์ ์์๋๋ก ์ ๋ ฌ๋) ์ ๋ฃ๋๋ค.
๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์๋ค๋ฉด pq์ ์ ์ฅ๋์ด for๋ฌธ ์๋ if๋ฌธ์ด ์คํ๋ ํ ๋ฐ pq์ ๋จน์ ์์๋๋ก ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋จน๊ณ
๊ทธ ์์น์์ ๋ค์ bfs๋ฅผ ํตํด ์์ด๋ฅผ ์์ง์ด๊ณ ๋จน์ ๋ฌผ๊ณ ๊ธฐ๋ค์ pq์ ๋ฃ์ด ์์ง์ผ ์ ์๋ค.
์ด ๋ฌธ์ ์ ํต์ฌ์ pq์ ๋ฌผ๊ณ ๊ธฐ๋ค์ ๋จน์ ์์๋๋ก ์ ๋ ฌํ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๋ฐ์ ์๋๊ฑฐ ๊ฐ๋ค.
๋ฌธ์ ์กฐ๊ฑด์์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น๋ค๋ฉด ๊ฐ์ฅ ์์ ์๋ ๋ฌผ๊ณ ๊ธฐ ์ฆ y๊ฐ์ด ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๊ณ ๊ฐ์ฅ ์ผ์ชฝ ๋ฌผ๊ณ ๊ธฐ๋ x๊ฐ์ด ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ cmp ํจ์์์ ๊ฑฐ๋ฆฌ, y ์ขํ, x ์ขํ ์์ผ๋ก ์ ๋ ฌํ ๋ฌผ๊ณ ๊ธฐ ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ๋ค.
๋ง์ฝ q์ ์์ง์์ด ๋๋ฌ๋๋ฐ ๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ค๋ฉด ์๋ง ์์ด๊ฐ ์ถ๋ํด์ผ ํ ์ฐจ๋ก์ด๋ฏ๋ก ์ฌํ ์์ง์ธ dist๋ฅผ ์ถ๋ ฅํ๊ณ while๋ฌธ์ ๋น ์ ธ๋์จ๋ค!
c++ ์ฝ๋ :
//
// 16236_babyShark.cpp
// SOMA๐ฉ๐ป๐ป
//
// Created by JoSoJeong on 2021/05/05.
//
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
int arr[21][21];
int n;
int visit[21][21];
int dx[] = { 0, 0, 1, -1 }; //up down left right
int dy[] = { 1, -1, 0, 0 };
using namespace std;
struct fish
{
int dist;
int y;
int x;
};
struct compare
{
bool operator()(fish a, fish b)
{
if (a.dist == b.dist)
{
if (a.y == b.y)
{
return a.x > b.x;
}
return a.y > b.y;
}
return a.dist > b.dist;
}
};
void eat_fish_bfs(pair<int, int> start){
queue<fish> q;
q.push({0, start.first, start.second});
int weight = 2; //ํ์ฌ ์์ด ๋ชธ๋ฌด๊ฒ
int dist = 0; // ์ด๋ ๊ฑฐ๋ฆฌ
int eatCount = 0; // ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์
while(true){
priority_queue<fish, vector<fish>, compare> pq; // ์กฐ๊ฑด์ ๋ง๊ฒ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ ๋ ฌํ ์ฐ์ ์์ ํ
while(!q.empty()){
int x = q.front().x;
int y = q.front().y;
int curDist = q.front().dist;
q.pop();
for(int i = 0; i <4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= n || ny >= n) continue;
if(arr[ny][nx] > weight || visit[ny][nx]) continue;
q.push({curDist + 1, ny, nx});
visit[ny][nx] = true;
if(arr[ny][nx] < weight && arr[ny][nx] != 0){
pq.push({curDist + 1, ny, nx});
}
}
}
memset(visit, false, sizeof(visit));
if(!pq.empty()){ // ๋จน์ ๋ฌผ๊ณ ๊ธฐ ๋จ์ ์๋ค๋ฉด
int fishX = pq.top().x;
int fishY = pq.top().y;
int fishDist = pq.top().dist;
pq.pop();
arr[fishY][fishX] = 0;
eatCount++;
dist = fishDist;
q.push({dist, fishY, fishX}); //์์ด ์์ง์
visit[fishY][fishX] = true;
}else{
cout << dist << '\n';
break;
}
if(eatCount == weight){
weight++;
eatCount = 0;
}
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
pair<int, int> start;
cin >> n;
for(int i = 0 ; i < n; i++){
for(int j = 0 ; j < n; j++){
cin >> arr[i][j];
if(arr[i][j] == 9){
start = {i, j};
arr[i][j] = 0;
visit[i][j] = true;
}
}
}
eat_fish_bfs(start);
return 0;
}