๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 7562 : ๋‚˜์ดํŠธ์˜ ์ด๋™ (BFS)

728x90

๋ฌธ์ œ

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

์ž…๋ ฅ

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

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

์ถœ๋ ฅ

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

 


 

๋ฐฑ์ค€ ์‹ค๋ฒ„1.

bfs๋กœ ํ’€๊ณ  ๋ฐ”๋กœ ์˜ˆ์ œ ๋„ฃ์–ด๋ดค๋Š”๋ฐ ใ…œ๋จผ๊ฐ€ ์ด์ƒํ•˜๊ธธ๋ž˜ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์ฝ์–ด๋ดค๋”๋‹ˆ....

์ด๋™ ์นธ์ด ์œ„/์•„๋ž˜/์–‘์˜†์ด ์•„๋‹ˆ๋ผ ๋ฌธ์ œ์— ์žˆ๋Š” ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ด๋™ํ•˜๋Š”๊ฑฐ์˜€์Œ;

๊ทธ๋ž˜์„œ ์ˆ˜์ •ํ•˜๊ณ  ๋ฐ”๋กœ ์ •๋‹ต!

 

ํ•ญ์ƒ ๋ฌธ์ œ๋ฅผ ๊ผผ๊ผผํ•˜๊ฒŒ ์ฝ์ž...^^

์ด์ œ bfs ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‰ฝ๋‹ค๊ณ  ๋Š๊ปด์งˆ ์ •๋„๋กœ ์ต์ˆ™ํ•ด์กŒ๋‹ค. ์—ญ์‹œ ๋งŽ์ด ํ’€์–ด๋ณด๋Š”๊ฒŒ ๋‹ต์ธ๋“ฏ.

 

 

๋‚˜์˜ ํ’€์ด

#include <iostream>
#include <queue>
using namespace std;

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

bool canGo(int visited[301][301], int x, int y){
    if(x<0 || y<0 || x>=l || y>=l) return false;
    if(visited[x][y]==1) return false;
    return true;
}

void bfs(int x, int y, int lx, int ly){
    int visited[301][301]={0};
    int mat[301][301] = {0};
    queue<pair<int, int>> q;
    q.push({x, y});
    while(!q.empty()){
        pair<int, int> a = q.front();
        q.pop();
        for (int i = 0; i < 8; ++i){
            int nx = a.first + dx[i];
            int ny = a.second + dy[i];
            if(nx==x && ny==y) continue;
            if (canGo(visited, nx, ny)){
                visited[nx][ny] = 1;
                q.push({nx, ny});
                mat[nx][ny] = mat[a.first][a.second] + 1;
            }
            if(nx==lx && ny==ly) break;
        }
    }
    answer = mat[lx][ly];
}

int main(){
    int t;
    int x;
    int y;
    int lx;
    int ly;
    cin >> t;
    for (int i = 0; i < t; ++i){
        cin >> l >> x>>y >> lx>>ly;
        bfs(x,y,lx,ly);
        cout << answer << "\n";
        answer = 0;
    }
}

 

728x90