본문 바로가기
PS 문제 풀이/Jungol

[Jungol] 정올 1078 저글링 방사능 오염

by 까망 하르방 2021. 2. 26.
반응형

출처: http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=358&sca=3040

 Input 

7 8

0010000

0011000

0001100

1011111

1111011

0011100

0011100

0001000

3 5

 

 Output 

9

0

입력받을 때, 저글링 표시를 -1』로 해서 저장합니다.

scanf("%1d", &map[i][j]);로 공백없는 숫자를 한 자리씩 받을 수 있습니다.

또한, BFS 탐색할 때, 저글링이 방사능이 걸려 죽는시간이 3초를 시작시간으로 합니다.

※ Input Data는 열의 크기, 행의 크기 순이므로 주의

 


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct zergling {
    int x, y, time;
}que[100 * 100];
int X, Y, sx, sy;
int map[101][101], visited[101][101];
int dr[] = { 0, 0, 1, -1 };
int dc[] = { 1, -1, 0, 0 };
int fr, re;
 
void input() {
    scanf("%d %d", &Y, &X);
    for (int i = 1; i <= X; ++i) {
        for (int j = 1; j <= Y; ++j) {
            scanf("%1d", &map[i][j]);
            if (map[i][j] == 1) map[i][j] = -1;
        }
    }
    scanf("%d %d %d %d", &sy, &sx);
}
 
void push(int x, int y, int elapsedTime) {
    // 범위를 벗어나는 경우
    if (x < 1 || y < 1 || x > X || y > Y) return;
 
    // 저글링이 없는 경우
    if (map[x][y] == 0) return;
 
    // 이미 방문한 경우
    if (visited[x][y]) return;
 
    // 방문 표시
    visited[x][y] = 1;
 
    // 저글링이 오염되어 죽는시간
    map[x][y] = elapsedTime;
    que[re++] = { x, y, elapsedTime };
}
 
void BFS() {
    zergling cur;
    push(sx, sy, 3);
    while (fr < re) {
        cur = que[fr++];
        for (int i = 0; i < 4; ++i)
            push(cur.x + dr[i], cur.y + dc[i], cur.time + 1);
    }
}
 
int main() {
    // freopen("input.txt", "r", stdin);
    input();
    BFS();
 
    int ansTime = 0;
    int liveCnt = 0;
    for (int i = 1; i <= X; ++i) {
        for (int j = 1; j <= Y; ++j) {
            if (map[i][j] == -1) liveCnt++;
            if (ansTime < map[i][j]) ansTime = map[i][j];
        }
    }
    printf("%d\n", ansTime);
    printf("%d\n", liveCnt);
}

 

반응형

댓글