뜌릅

아기상어 16236번 [백준] 본문

알고리즘/PS 문제

아기상어 16236번 [백준]

TwoCastle9 2022. 9. 3. 16:45
반응형

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

 

16236번: 아기 상어

N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가

www.acmicpc.net

 

bfs을 활용하여 푸는 문제입니다.

#include<bits/stdc++.h>
#include<sys/types.h>

using namespace std;
#define endl '\n'
#define fast_io ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define rep(i, j) for(ll i=0;i<j;i++)
#define pii pair<int,int>
#define ff first
#define ss second

int dx[] = {-1, 0, 0, 1};
int dy[] = {0, -1, 1, 0};

int n;
vector<vector<int>> v;
pii shark;
vector<vector<int>> visited;
int size2 = 2;
int cnt = 0;
int min_x = 99;
int min_y = 99;
int min_dist = 11111;

int search() {
    queue<pii > q;
    q.push(shark);

    while (!q.empty()) {
        auto cur = q.front();
        q.pop();
        rep(i, 4) {
            int _x = cur.ff + dx[i];
            int _y = cur.ss + dy[i];
            if (_x < 0 || _y < 0 || _x >= n || _y >= n)continue;
            if (visited[_x][_y] != 0 || v[_x][_y] > size2)continue;
            visited[_x][_y] = visited[cur.ff][cur.ss] + 1;
            if (v[_x][_y] < size2 && v[_x][_y] != 0) {
                if (min_dist > visited[_x][_y]) {
                    min_x = _x;
                    min_y = _y;
                    min_dist = visited[_x][_y];
                } else if (min_dist == visited[_x][_y]) {
                    if (min_x == _x) {
                        if (min_y > _y) {
                            min_x = _x;
                            min_y = _y;
                        }
                    } else if (min_x > _x) {
                        min_x = _x;
                        min_y = _y;
                    }
                }
            }
            q.push({_x, _y});
        }
    }
    cnt++;
    if (min_x == 99)return -1;
    shark = {min_x, min_y};
    int ans = visited[min_x][min_y];
    v[min_x][min_y] = 0;
    return ans;
}

void solve() {
    cin >> n;
    v = vector<vector<int>>(n, vector<int>(n));
    visited = vector<vector<int>>(n, vector<int>(n, 0));
    rep(i, n)rep(j, n) {
            cin >> v[i][j];
            if (v[i][j] == 9)shark = {i, j};
        }
    v[shark.ff][shark.ss] = 0;
    int ans = 0;
    while (1) {
        visited = vector<vector<int>>(n, vector<int>(n, 0));
        min_x = 99;
        min_y = 99;
        min_dist = 999;
        int s = search();
        if (cnt == size2) {
            cnt = 0;
            size2++;
        }
        if (s == -1) {
            cout << ans << endl;
            return;
        }
        ans += s;
    }
}

int main() {
    fast_io;
    solve();
    return 0;
}
반응형

'알고리즘 > PS 문제' 카테고리의 다른 글

귀찮아 14929번 [백준]  (0) 2022.11.12
Photoshoot 18323번 [백준]  (0) 2022.11.11
테트로미노 14500번 [백준]  (0) 2022.09.02
외판원 순회3 16991번 [백준]  (0) 2022.09.01
Cow Art(적록색약) 10026번 [백준]  (2) 2022.08.31