题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入
一行四个数据,棋盘的大小和马的坐标
输出
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
样例输入
4 4 1 1
样例输出
0 3 2 5 3 4 1 2 2 1 4 3 5 2 3 2
提示
来源
#include<bits/stdc++.h>
using namespace std;
int mp[405][405],n,m,sx,sy;
bool vis[405][405];
struct node{int x,y,s;};
queue <node>q;
int dx[8]={1,2,2,1,-1,-2,-2,-1},dy[8]={-2,-1,1,2,2,1,-1,-2};
void bfs(int x,int y){
node q1={x,y,0};
mp[x][y]=0;
q.push(q1);
vis[x][y]=1;
while(!q.empty()){
node q2=q.front();
q.pop();
for(int i=0;i<8;i++){
int xx=dx[i]+q2.x,yy=dy[i]+q2.y;
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&vis[xx][yy]==0){
node q3={xx,yy,q2.s+1};
mp[xx][yy]=q2.s+1;
q.push(q3);
vis[xx][yy]=1;
}
}
}
}
int main(){
cin>>n>>m>>sx>>sy;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
mp[i][j]=-1;
}
}
bfs(sx,sy);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<left<<setw(5)<<mp[i][j];
}cout<<endl;
}
return 0;}