【题目描述】
输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。
【输入】
首先输入一个nn,表示测试样例的个数。
每个测试样例有三行。
第一行是棋盘的大小L(4≤L≤300)L(4≤L≤300);
第二行和第三行分别表示马的起始位置和目标位置(0..L−1)(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; }