관리 메뉴

어읽로꾸거

BOJ 16469 소년 점프 본문

알고리즘

BOJ 16469 소년 점프

어읽로꾸거 2019. 3. 28. 18:13

백준 16469 링크

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

해결 과정

45분정도 걸려서 구상하고 예제에서 걸린거 해결후 한번에 통과! 😎

 

 우선 악당들 3명의 위치를 입력받고 바로 {y위치, x위치, 악당번호} 를 매개로 큐에 넣어준다. 그리고 3개의 각각의 악당 방문배열을 만들어 bfs로 돌아다닐때마다 언제(몇 턴) 도착했는지 기록한다. 큐에서 다 탐색한 후 다시 탐색을 돌며 방문배열 3개를 비교하여 3명 다 방문했는지, 해당 칸의 최소값이 몇인지를 구하여 답과 비교 한다.

코드

#include<iostream>
#include<queue>
using namespace std;
typedef struct pack{
    int y, x, who;
};
int y[] = { 0,0,1,-1 };
int x[] = { 1,-1,0,0 };
int map[105][105];
int visit[105][105][3];
int n, m;
bool check(int y, int x) {
    if (y >= 1 && y <= n && x >= 1 && x <= m && map[y][x] == 0)
        return true;
    else
        return false;
}
int main() {
    freopen("input.txt", "r", stdin);
    cin >> n >> m;
    queue <pack> q;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            scanf("%1d", &map[i][j]);
        }
    }
    for (int i = 0; i < 3; i++) {
        int a, b;
        cin >> a >> b;
        visit[a][b][i] = 1;
        q.push({ a,b,i });
    }
    while (!q.empty()) {
        int nowy = q.front().y;
        int nowx = q.front().x;
        int who = q.front().who;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int nexty = nowy + y[i];
            int nextx = nowx + x[i];
            if (check(nexty, nextx) && visit[nexty][nextx][who] == 0) {
                q.push({ nexty,nextx,who });
                visit[nexty][nextx][who] = visit[nowy][nowx][who] + 1;
            }
        }
    }
    int ans = 0x7fffffff, ansn = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            int max = -1;
            bool allpass=true;
            for (int k = 0; k < 3; k++) {
                if (visit[i][j][k] == 0) {
                    allpass = false; //3명 다 안지나감
                }
                if (max < visit[i][j][k]) {
                    max = visit[i][j][k]; //여기에 3명 지나가는 최소 턴 구하기
                }
            }
            if (ans > max && allpass) { //값 갱신
                ans = max; ansn = 1;
            }
            else if (ans == max) ansn++;
        }
    }
    if (ans == 0x7fffffff) {
        cout << -1;
    }
    else {
        cout << ans - 1 << endl << ansn;
    }
}

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

BOJ 2504 괄호의 값  (0) 2019.03.31
BOJ 16118 달빛여우  (0) 2019.03.30
BOJ 16953 A → B  (0) 2019.03.27
BOJ 1932 정수 삼각형  (0) 2019.03.26
BOJ 1620 나는야 포켓몬 마스터 이다솜  (0) 2019.03.24