백준알고리즘

나이트의 이동

먼지의삶 2019. 8. 14. 17:58
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>


using namespace std;

struct posi{
    int x,y;
};

posi st, ed;
int tc;
int l;
int map[300][300];
bool d[300][300];
int dist[300][300];
int dx[] = {-2, -1,-2,-1,1,2,2,1};
int dy[] = {-1, -2,1, 2,-2,-1,1,2};
int ans = 0;
void bfs( ){
    queue<pair<int, int>> q;
    q.push({st.x, st.y});
    dist[st.x][st.y] = 0;
    d[st.x][st.y] = true;
    while(!q.empty()){
        int x = q.front().first; int y = q.front().second;
        q.pop();
        for(int i = 0; i < 8; i++){
            int nx = x+dx[i]; int ny = y+dy[i];
            if(nx >= 0 && nx < l && ny>=0 &&ny <l){
                if(d[nx][ny] == false){

                    q.push({nx,ny});
                    dist[nx][ny] = dist[x][y]+1;
                    d[nx][ny] = true;
                    if(nx == ed.x && ny == ed.y){
                        ans = dist[nx][ny];
                    }

                }
            }
        }
    }

}

int main(){
    scanf("%d", &tc);
    for(int t = 1; t<=tc; t++){
        ans = 0;
        memset(map, 0, sizeof(map));
        memset(dist, 0, sizeof(dist));
        memset(d,false, sizeof(d));
        scanf("%d", &l);
        scanf("%d %d", &st.x, &st.y);
        scanf("%d %d", &ed.x, &ed.y);

        bfs();
        printf("%d\n",ans);
    }
    return 0;

}

BFS