• toc {:toc}

๋ฌธ์ œ

์ฒด์ŠคํŒ ์œ„์— ํ•œ ๋‚˜์ดํŠธ๊ฐ€ ๋†“์—ฌ์ ธ ์žˆ๋‹ค. ๋‚˜์ดํŠธ๊ฐ€ ํ•œ ๋ฒˆ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์€ ์•„๋ž˜ ๊ทธ๋ฆผ์— ๋‚˜์™€์žˆ๋‹ค. ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์ด ์ฃผ์–ด์ง„๋‹ค. ๋‚˜์ดํŠธ๋Š” ๋ช‡ ๋ฒˆ ์›€์ง์ด๋ฉด ์ด ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์„ธ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ฒซ์งธ ์ค„์—๋Š” ์ฒด์ŠคํŒ์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด l(4 โ‰คย l โ‰ค 300)์ด ์ฃผ์–ด์ง„๋‹ค. ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ๋Š” l ร— l์ด๋‹ค. ์ฒด์ŠคํŒ์˜ ๊ฐ ์นธ์€ ๋‘ ์ˆ˜์˜ ์Œ {0, โ€ฆ, l-1} ร— {0, โ€ฆ, l-1}๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋‘˜์งธ ์ค„๊ณผ ์…‹์งธ ์ค„์—๋Š” ๋‚˜์ดํŠธ๊ฐ€ ํ˜„์žฌ ์žˆ๋Š” ์นธ, ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ๋‚˜์ดํŠธ๊ฐ€ ์ตœ์†Œ ๋ช‡ ๋ฒˆ๋งŒ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

์ถœ์ฒ˜:https://www.acmicpc.net/problem/7562

ํ’€์ด

2022-08-07

BFS๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•˜์ง€๋งŒ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™”ํ•˜๋Š” dx, dy๊ฐ’์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด์ฃผ๋ฉด ์–ด๋ ค์›€ ์—†์ด ํ’€์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
 
int dist[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 l;
pair<int, int> now, target;
queue<pair<int, int>> q;
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T;
    cin >> T;
    while(T--){
        cin >> l;
        cin >> now.X >> now.Y;
        cin >> target.X >> target.Y;
 
        while(!q.empty()){
            q.pop();
        }
 
        // dist ฤ‚ฤ˜ฤ…รขฤŒยญ
        for(int i = 0; i < l; i++){
            for(int j = 0; j < l; j++){
                dist[i][j] = -1;
            }
        }
        q.push({now.X, now.Y});
        dist[now.X][now.Y] = 0;
        if(now.X == target.X && now.Y == target.Y){
            cout << dist[now.X][now.Y] << endl;
            continue;
        }
 
        for(int i = 0; i < l; i++){
            for(int j = 0; j < l; j++){
                while(!q.empty()){
                    auto cur = q.front(); q.pop();
                    for(int dir = 0; dir < 8; dir++){
                        int nx = cur.X + dx[dir];
                        int ny = cur.Y + dy[dir];
                        if(nx < 0 || nx >= l || ny < 0 || ny >= l) continue;
                        if(dist[nx][ny] >= 0) continue;
                        dist[nx][ny] = dist[cur.X][cur.Y] + 1;
                        if(target.X == nx && target.Y == ny){
                            cout << dist[nx][ny] << endl;
                            break;
                        }
                        q.push({nx, ny});
                    }
                }
            }
        }
    }
}

2023-09-07 ํ’€์ด

BFS ๋ฌธ์ œ์ธ ๊ฒƒ์„ ์•Œ๋ฉด ๊ตฌ์กฐ๋Š” ์ •ํ˜•ํ™”๋˜์–ด ์žˆ์–ด ํ’€์ด๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
 
int dx[8] = {-1, -1, 1, 1, -2, -2, 2, 2};
int dy[8] = {-2, 2, -2, 2, -1, 1, -1, 1};
int T, I;
queue<pair<int, int>> q;
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
 
    pair<int, int> start, end;
 
    cin >> T;
 
    
    while(T--){
        int board[303][303] = {0,};
        int dist[303][303] = {0,};
        cin >> I;
        cin >> start.X >> start.Y;
        q.push(start);
        cin >> end.X >> end.Y;
        
 
        if (start.X == end.X && start.Y == end.Y) {
            cout << 0 << '\n';
            continue;
        }
        while(!q.empty()){
            auto cur = q.front(); q.pop();
            for(int dir = 0; dir < 8; dir++){
                int nx = cur.X + dx[dir];
                int ny = cur.Y + dy[dir];
                if(nx < 0 || nx >= I || ny < 0 || ny >= I) continue;
                if(dist[nx][ny] > 0) continue;
                dist[nx][ny] = dist[cur.X][cur.Y]+1;
                if(nx == end.X && ny == end.Y){
                    cout << dist[nx][ny] << '\n';
                    break;
                }
                q.push({nx, ny});
            }
        }
        
    }
 
    return 0;
}