✏️ Algorithm/알고리즘 풀이

7562번 나이트의 이동 - C++

미미누 2022. 8. 2. 23:11

✅️[문제]
https://www.acmicpc.net/problem/7562

7562번: 나이트의 이동

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수

www.acmicpc.net


✅️[풀이]

나이트의 이동을 BFS로 풀면 된다.
한 번의 이동을 8번으로 늘리면 된다!
그리고 목표 좌표에 도착하면 vis 값을 출력한다.

✅️[코드]

#include <bits/stdc++.h>

using namespace std;

#define X first

#define Y second

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

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

int arr[302][302];

bool vis[302][302];

int main() {

    ios::sync_with_stdio(0);

    cin.tie(0);

    

    int l;

    cin >> l;

    

    while(l--){

        int ans =0;

        int n;

        cin >> n;

        int x, y;

        cin >> x >> y;

        int x2, y2;

        cin >> x2 >> y2;

        vis[x][y] = 1;

        queue<pair<int,int>> q;

        q.push({x,y});

        while(!q.empty()){

            pair<int,int> q2 = q.front(); q.pop();

            if(arr[x2][y2] > 0) break;

            for(int i=0; i<8; i++){

                int x = q2.X + dx[i];

                int y = q2.Y + dy[i];

                

                if(x<0 || x>=n || y<0 || y>=n) continue;

                if(vis[x][y] > 0) continue;

                

                vis[x][y] =1;

                arr[x][y] = arr[q2.X][q2.Y] + 1;

                q.push({x,y});

            }

        }

        cout << arr[x2][y2] << '\n';

        memset(arr, 0, sizeof(arr));

        memset(vis, 0, sizeof(vis));

    }
}

'✏️ Algorithm > 알고리즘 풀이' 카테고리의 다른 글

2583번 영역구하기 - C++  (0) 2022.08.04
1627번 곱셈 - C++  (0) 2022.08.04
5427번 불 - C++  (0) 2022.08.02
1012번 유기농 배추 - C++  (0) 2022.07.31
10026번 적록색약 - C++  (0) 2022.07.31