BOJ 16236 아기 상어


사용한 알고리즘

  • BFS

알고리즘 설명

  • 단순하다. BFS로 아기상어가 가장 빠르게 먹을 수 있는 물고기를 찾는다.
  • 가까운 물고기중, 가장 위쪽이며 왼쪽인 물고기 위치를 찾는다.
  • 물고기를 먹고 크기를 키운다.
  • 이를 반복한다.
  • 더이상 먹을 물고기가 없으면 최종 시간을 출력한다.

풀이

// baekjoon 16236 yechan
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <utility>
using namespace std;
typedef pair<int, int> P;
const int MAX_N = 20;
const int INF = 1e9;
const int dir[4][2] = {{0,-1},{0,1}, {-1,0}, {1,0}};
int N, sx, sy, fsize=2;
int board[MAX_N][MAX_N];
bool visited[MAX_N][MAX_N];

int BFS() {
    queue<P> q;
    q.push(P(sx, sy));
    memset(visited, 0, sizeof(visited));
    visited[sx][sy]=true;
    int depth = 0;
    int fish_x = INF, fish_y = INF;
    bool flag = false;
    while (!q.empty()) {
        int qSzie = q.size();
        while (qSzie--) {
            int cx = q.front().first;
            int cy = q.front().second;
            q.pop();
            if (board[cx][cy] && board[cx][cy] != 9 && board[cx][cy] < fsize) {
                flag = true;
                if (cx < fish_x) {
                    fish_x = cx;
                    fish_y = cy;
                }
                else if (cx == fish_x && cy < fish_y) {
                    fish_y = cy;
                }
            }
            for (int d=0; d<4; d++) {
                int nx = cx + dir[d][0];
                int ny = cy + dir[d][1];
                if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue;
                if (visited[nx][ny]) continue;
                if (board[nx][ny] > fsize) continue;
                visited[nx][ny]=true;
                q.push(P(nx, ny));
            }
        }
        if (flag) {
            board[sx][sy]=0;
            board[fish_x][fish_y]=9;
            sx = fish_x, sy = fish_y;
            return depth;
        }
        depth++;
    }
    return -1;
}

int main() {
    scanf("%d", &N);
    for (int i=0; i<N; i++) {
        for (int j=0; j<N; j++) {
            scanf("%d", &board[i][j]);
            if (board[i][j] == 9) {
                sx = i, sy = j;
            }
        }
    }

    int fish_time = 0;
    int cnt=0;
    while (1) {
        int ret = BFS();
        if (ret == -1) {
            printf("%d\n", fish_time);
            break;
        }
        else {
            cnt++;
            if (cnt == fsize) {
                fsize++;
                cnt=0;
            }
            fish_time += ret;
        }
    }

    return 0;
}



© 2020.08. by fbdp1202

Powered by theorydb