티스토리 뷰

알고리즘/BOJ

[BOJ 16236] 아기 상어

히더 2019. 1. 9. 17:45

백준 :: BOJ :: 16236 :: 아기 상어


출처 : https://www.acmicpc.net/problem/16236


#include <bits/stdc++.h>

using namespace std;


int N, t, tt, fs, ss, si, sj, ni, nj,

arr[21][21], v[21][21], di[] = {-1,0,0,1}, dj[] = {0,-1,1,0};

queue<pair<int, int>> q; priority_queue<int,vector<int>,greater<int>> pq;


void clear() { 

queue<pair<int, int>> e; priority_queue<int, vector<int>, greater<int>>ee; swap(pq, ee); swap(q, e);

memset(v, 0, sizeof(v)); q.push(make_pair(ni, nj)); 

}


void bfs() {

while (!q.empty()) {

int s = q.size(); tt++;

while (s--) {

auto tmp = q.front(); q.pop();

for (int d = 0; d < 4; d++) {

ni = tmp.first + di[d]; nj = tmp.second + dj[d];

if (ni > 0 && ni <= N && nj > 0 && nj <= N && arr[ni][nj] <= ss &&!v[ni][nj]) {

if (arr[ni][nj] < ss && arr[ni][nj] >0) pq.push(ni*100+nj);

else v[ni][nj] = 1, q.push(make_pair(ni, nj));

}

}

}

if (!pq.empty()) {

ni = pq.top() / 100; nj = pq.top() % 100;

fs++; arr[ni][nj] = 0; clear(); t += tt; tt = 0;

if (ss == fs) ss++, fs = 0;

}

}

}


int main() {

std::ios::sync_with_stdio(false); cin.tie(0);

cin >> N; t = 0; ss = 2; fs = 0;

for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) {

cin >> arr[i][j]; if (arr[i][j] == 9) arr[i][j]=0, si = i, sj = j, q.push(make_pair(i,j));

}

bfs();

cout << t;

return 0;

}


'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ 16235] 나무 재테크  (0) 2019.01.10
[BOJ 16234] 인구 이동  (0) 2019.01.09
[BOJ 5373] 큐빙  (2) 2018.10.25
[BOJ 15686] 치킨 배달  (0) 2018.10.08
[BOJ 15685] 드래곤 커브  (0) 2018.10.07
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함