【题目描述】
一个8×8的棋盘上有一个马初始位置为(a, b),他想跳到(c, d),问是否可以?如果可以,最少要跳几步?
【输入】一行四个数字a, b, c, d。
【输出】如果跳不到,输出-1;否则输出最少跳到的步数。
【样例输入】1 1 2 3
【样例输出】1
【数据规模和约定】0<a, b, c, d≤8且都是整数。
【代码解答】
广搜
#include<bits/stdc++.h>
using namespace std;
class mp{
public:
int step{};
bool book{};
}ans[9][9];
deque<pair<int,int> > dq;
int x,y,c,d;
int dx[8]={1,2,2,1,-1,-2,-2,-1};
int dy[8]={2,1,-1,-2,-2,-1,1,2};
inline add(int nx,int ny){
dq.push_back(make_pair(nx,ny));
}
int main(){
cin>>x>>y>>c>>d;
add(x,y);
ans[x][y].step=0;
ans[x][y].book=true;
while(!dq.empty()){
int ox=dq[0].first;
int oy=dq[0].second;
for(int i=0;i<8;++i){
int nx=ox+dx[i];
int ny=oy+dy[i];
if(nx<1||ny<1||nx>8||ny>8)continue;
if(ans[nx][ny].book)continue;
add(nx,ny);
ans[nx][ny].step=ans[ox][oy].step+1;
ans[nx][ny].book=true;
}
dq.pop_front();
}
cout<<(ans[c][d].book?ans[c][d].step:-1);
return 0;
}