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

[Jungol] 정올 1106 장기

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

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

 Input 

9 9

3 5 2 8

 

 Output 

2 

아래와 같이 말을 움직이면 2번에 졸을 잡을 수 있습니다.

① 말이 움직이는 방향은 8가지 입니다.

② visited[][] 배열을 초기에 임의의 큰 수로 초기화 한 후,

    BFS 탐색하면서 최소 움직임으로 방문한 횟수를 저장합니다.

    (즉, visited[][]에는 더 적은 움직임 횟수를 재방문 허용)

③ 졸이 위치한 좌표가 ex, ey일 때, visited[ex][ey] 출력

 


#include <stdio.h>
const int INF = 2e9;
const int MAX_NM = 100 + 5;
const int dx[] = {-2, -2, -1, -1, 1, 1, 2, 2};
const int dy[] = {-1, 1, -2, 2, -2, 2, -1, 1};
int N, M;
int sx, sy, ex, ey;
int visited[MAX_NM][MAX_NM];
struct Node{
    int x, y, cost;
}que[MAX_NM * MAX_NM * 8];
int fr, re;
 
void init() {
    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= M; ++j) {
            visited[i][j] = INF;
        }
    }
}
 
void BFS() {
    que[re++] = { sx, sy, 0 };
    visited[sx][sy] = 0;
    while (fr < re) {
        Node cur = que[fr++];
 
        if (cur.x == ex && cur.y == ey) {
            continue;
        }
 
        for (int i = 0; i < 8; ++i) {
            int nextX = cur.x + dx[i];
            int nextY = cur.y + dy[i];
 
            if (nextX < 1 || nextY < 1 || nextX > N || nextY > M)
                continue;
            
            int nextCost = cur.cost + 1;
            if (visited[nextX][nextY] <= nextCost) continue;
 
            visited[nextX][nextY] = nextCost;
            que[re++] = { nextX, nextY, nextCost };
        }
    }
}
 
int main() {
    // freopen("input.txt", "r", stdin);
    scanf("%d %d", &N, &M);
    scanf("%d %d %d %d", &sx, &sy, &ex, &ey);
 
    init();
    BFS();
    printf("%d\n", visited[ex][ey]);
}

 

반응형

'PS 문제 풀이 > Jungol' 카테고리의 다른 글

[Jungol] 정올 2097 지하철  (0) 2021.02.27
[Jungol] 정올 1840 치즈  (2) 2021.02.27
[Jungol] 정올 1462 보물섬  (2) 2021.02.27
[Jungol] 정올 3008 교통수단 선택하기  (0) 2021.02.27
[Jungol] 정올 3109 숫자 야구2  (0) 2021.02.27

댓글