본문 바로가기
CS/알고리즘

백준 16236 아기상어(bfs)

by zieunee 2020. 5. 6.
반응형

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

 

 

16236번: 아기 상어

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

www.acmicpc.net

 

막 풀어서 소스가 매우 구림 

dfs는 시간초과남 > bfs로 풀자

#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;

int N;
int map[21][21];
int vis[21][21];
int sx, sy, sny, snx, curr_size;
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,-1,0,1 };
int minVal;
int time, ti;
int eatFish;
queue<pair<pair<int, int>,pair<int, int>>> q;
void bfs() {
    while (!q.empty()) {

        int x = q.front().first.first;
        int y = q.front().first.second;

        int t = q.front().second.first;
        int size = q.front().second.second;
        q.pop();

        if (map[x][y] < size && map[x][y] != 0 && map[x][y] != 9) {
            if (t < minVal) {
                minVal = t;
                ti = t;
                sx = x, sy = y;
            }
            else if (t == minVal) {
                if (sx > x)
                    sx = x, sy = y;
                else if (sx == x)
                    if (sy > y)
                        sx = x, sy = y;
                ti = t;
            }
            continue;
        }

        
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];

            if (nx < N && ny < N && nx >= 0 && ny >= 0 && vis[nx][ny] == 0 && map[nx][ny] <= size) {
                vis[nx][ny] = 1;
                q.push({ {nx,ny},{t+1,size} });
            }

        }


    }

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

    while (-1) {
        snx = sx, sny = sy;
        minVal = 987654321;
        memset(vis, 0, sizeof(vis));
        vis[snx][sny] = 1;
        q.push({ {snx,sny},{0,size} });
        bfs();
        if (snx == sx && sny == sy) break;
        time += ti;
        eatFish = eatFish + 1;
        if (eatFish == size) {
            size++;
            eatFish = 0;
        }
        map[sx][sy] = 0;
    }

    printf("%d", time);

}
반응형

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

백준 17825 주사위 윷놀이(시뮬+dfs)  (0) 2020.05.06
백준 17143 낚시왕(시뮬)  (0) 2020.05.06
백준 17837 새로운 게임2  (0) 2020.03.05
백준 17779 게리맨더링2  (0) 2020.03.04
백준 13460 구슬탈출2  (0) 2020.02.15