【题目描述】

输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。

 【bfs】Knight Moves 随笔

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

【输入】

首先输入一个nn,表示测试样例的个数。

每个测试样例有三行。

第一行是棋盘的大小L(4L300)L(4≤L≤300);

第二行和第三行分别表示马的起始位置和目标位置(0..L1)(0..L−1)。

 

【输出】

马移动的最小步数,起始位置和目标位置相同时输出00。

【输入样例】

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

【输出样例】

5
28
0

【思路】:简单的bfs求最优解,主要是注意八个方向

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<string>
#include<cstring>
using namespace std;
const int maxn=999999999;
const int minn=-999999999;
inline int read() {
    char c = getchar();
    int x = 0, f = 1;
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
//马移动的最小步数,起始位置和目标位置相同时输出0。
/*
首先输入一个n,表示测试样例的个数。
每个测试样例有三行。
第一行是棋盘的大小L(4≤L≤300);
第二行和第三行分别表示马的起始位置和目标位置(0..L?1)。
*/
struct node {
    int x,y,setp;
};
int bx,by,visit[410][410],sx,sy,n;
int dir[8][2]= {{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
int main() {
    int N;
    cin>>N;
pyyyyyy:
    while(N--) {
        cin>>n;
        for(int i=1; i<=n; ++i) {
            for(int j=1; j<=n; ++j) {
                visit[i][j]=0;
            }

        }
        cin>>bx>>by;
        cin>>sx>>sy;
        if(bx==sx&&by==sy) {
            cout<<0<<endl;
        }
        queue<node>q;
        visit[bx][by]=1;
        q.push((node) {
            bx,by,1
        });
        while(!q.empty() ) {
            node p=q.front();
            q.pop();
            for(int i=0; i<8; ++i) {
                int px=p.x +dir[i][0];
                int py=p.y +dir[i][1];
                if(px==sx&&py==sy) {
                    cout<<p.setp<<'\n';
                    goto pyyyyyy;
                }
                if(px >0&&px<=n&&py>0&&py<=n&&!visit[px][py]) {
                    visit[px][py]=1;
                    node kkk;
                    kkk.x=px;
                    kkk.y=py;
                    kkk.setp=p.setp+1;
                    q.push(kkk);
                }
            }
        }
    }
    return 0;
}

 





扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄