Baekjoon #16236

Baekjoon #16236

1개의 풀이 · C++

문제 원문 보기 ↗

SOLUTION INFO

C++ · main.cpp

main.cpp
#include<bits/stdc++.h>

using namespace std;

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

int Map[22][22], n;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n;

    int sy, sx;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin >> Map[i][j];
            if(Map[i][j] == 9)sy = i, sx = j;
        }
    }

    bool done = true;
    int ate = 2, sharkSize = 2;
    int answer = 0;
    while(done){
        bool visited[22][22] = { };
        int ny = -1, nx = -1, times = -1;
        Map[sy][sx] = 0;
        
        queue<pair<int, int>> q;
        q.push(pair<int, int>(sy, sx));
        visited[sy][sx] = true;

        while(!q.empty()){
            int qsize = q.size();
            ++times;
            while(qsize--){
                auto [y, x] = q.front(); q.pop();
                if(Map[y][x] && Map[y][x] < sharkSize){
                    if(!~ny)ny = y, nx = x;
                    else {
                        if(y < ny)ny = y, nx = x;
                        else if(y == ny && x < nx)nx = x;
                    }
                }
                
                for(int k=0;k<4;k++){
                    int qy = y + dy[k];
                    int qx = x + dx[k];
                    if(0 > qy || qy >= n || 0 > qx || qx >= n)continue;
                    if(visited[qy][qx])continue;
                    visited[qy][qx] = true;
                    if(Map[qy][qx] > sharkSize)continue;
                    q.push(pair<int, int>(qy, qx));
                } 
            }
            if(~ny){
                if(--ate == 0)ate = ++sharkSize;
                break;
            }
        }

        sy = ny, sx = nx;
        if(!~ny)done = false;
        else answer += times;
    }

    cout << answer;

    return 0;
}

SOLUTION DESCRIPTION

풀이 설명

등록된 풀이 설명이 없습니다.