πŸ•οΈ PS (BOJ)/BFS and DFS

[BOJ S2][C++] λ°±μ€€ 7562번: λ‚˜μ΄νŠΈμ˜ 이동

선달 2022. 3. 15. 20:45
λ°˜μ‘ν˜•

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

 

7562번: λ‚˜μ΄νŠΈμ˜ 이동

체슀판 μœ„μ— ν•œ λ‚˜μ΄νŠΈκ°€ 놓여져 μžˆλ‹€. λ‚˜μ΄νŠΈκ°€ ν•œ λ²ˆμ— 이동할 수 μžˆλŠ” 칸은 μ•„λž˜ 그림에 λ‚˜μ™€μžˆλ‹€. λ‚˜μ΄νŠΈκ°€ μ΄λ™ν•˜λ €κ³  ν•˜λŠ” 칸이 μ£Όμ–΄μ§„λ‹€. λ‚˜μ΄νŠΈλŠ” λͺ‡ 번 움직이면 이 칸으둜 이동할 수

www.acmicpc.net

 

문제

체슀판 μœ„μ— ν•œ λ‚˜μ΄νŠΈκ°€ 놓여져 μžˆλ‹€. λ‚˜μ΄νŠΈκ°€ ν•œ λ²ˆμ— 이동할 수 μžˆλŠ” 칸은 μ•„λž˜ 그림에 λ‚˜μ™€μžˆλ‹€. λ‚˜μ΄νŠΈκ°€ μ΄λ™ν•˜λ €κ³  ν•˜λŠ” 칸이 μ£Όμ–΄μ§„λ‹€. λ‚˜μ΄νŠΈλŠ” λͺ‡ 번 움직이면 이 칸으둜 이동할 수 μžˆμ„κΉŒ?

μž…λ ₯

μž…λ ₯의 첫째 μ€„μ—λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ κ°œμˆ˜κ°€ μ£Όμ–΄μ§„λ‹€.

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” μ„Έ μ€„λ‘œ 이루어져 μžˆλ‹€. 첫째 μ€„μ—λŠ” 체슀판의 ν•œ λ³€μ˜ 길이 l(4 ≤ l ≤ 300)이 μ£Όμ–΄μ§„λ‹€. 체슀판의 ν¬κΈ°λŠ” l × l이닀. 체슀판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. λ‘˜μ§Έ 쀄과 μ…‹μ§Έ μ€„μ—λŠ” λ‚˜μ΄νŠΈκ°€ ν˜„μž¬ μžˆλŠ” μΉΈ, λ‚˜μ΄νŠΈκ°€ μ΄λ™ν•˜λ €κ³  ν•˜λŠ” 칸이 μ£Όμ–΄μ§„λ‹€.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ λ‚˜μ΄νŠΈκ°€ μ΅œμ†Œ λͺ‡ λ²ˆλ§Œμ— 이동할 수 μžˆλŠ”μ§€ 좜λ ₯ν•œλ‹€.

 

풀이

BFS μ΄μš©ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ 풀이 κ°€λŠ₯ν•˜λ‹€.

단 λ‚˜μ΄νŠΈμ˜ 이동방ν–₯에 맞게 dx dy 배열듀을 μ„€μ •ν•΄μ£Όκ³ 

이차원 배열은 거리만 담아도 μΆ©λΆ„ν•˜λ‹€.

μ•½κ°„μ˜ λ³€ν˜•μ΄ κ°€ν•΄μ§„ BFS 문제

// Authored by : seondal
// 풀이 : https://whkakrkr.tistory.com/
// Co-authored by : -

//#include <bits/stdc++.h>
#include <iostream>
#include <queue>

using namespace std;

int dis[302][302];

int dx[8] = {-2, -1, 1, 2, -2, -1, 1, 2};
int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int t;
    cin >> t;
    while(t--){
        queue<pair<int, int>> q;
        int n, a, b;
        
        cin >> n;  // μΉΈ μ„€μ •
        
        // μ΄ˆκΈ°ν™”
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                dis[i][j] = -1;
            }
        }
        
        cin >> a >> b;  // μΆœλ°œμ§€ μ„€μ •
        dis[a][b] = 0;
        q.push({a,b});
    
        cin >> a >> b;  // 도착지 μ„€μ •
        
        while(!q.empty()){
            pair<int, int> current = q.front();
            q.pop();
            
            for(int dir=0; dir<8; dir++){
                int x = current.first + dx[dir];
                int y = current.second + dy[dir];
                
                if(x<0 || x>=n || y<0 || y>=n) continue;
                if(dis[x][y] >= 0) continue;
                dis[x][y] = dis[current.first][current.second] + 1;
                q.push({x,y});
            }
        }
        
        cout << dis[a][b] << "\n";
    }
    return 0;
}

/*
 */
λ°˜μ‘ν˜•