题目描述
有一个 n×mn×m 的棋盘,在某个点 (x,y)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 n,m,x,yn,m,x,y。
输出格式
一个 n×mn×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1−1)。
输入输出样例
输入 #1复制
3 3 1 1
输出 #1复制
0 3 2 3 -1 1 2 1 4
说明/提示
数据规模与约定
对于全部的测试点,保证 1≤x≤n≤4001≤x≤n≤400,1≤y≤m≤4001≤y≤m≤400。
直接BFS就好了
还是那句话:点个赞再走吧!
#include<bits/stdc++.h>
using namespace std;
int f[410][410];
int xd[8]={1,2,2,1,-1,-2,-2,-1};
int yd[8]={2,1,-1,-2,-2,-1,1,2};
int n,m,x,y;
void bfs()
{
f[x][y]=0;
queue<int>q;
q.push(x);
q.push(y);
while(q.size()>0)
{
int ax=q.front();
q.pop();
int ay=q.front();
q.pop();
for(int i=0;i<8;i++)
{
int nx=ax+xd[i];
int ny=ay+yd[i];
if(f[nx][ny]==-1 && nx>=1 && nx<=n && ny>=1 && ny<=m)
{
f[nx][ny]=f[ax][ay]+1;
q.push(nx);
q.push(ny);
}
}
}
}
int main()
{
cin>>n>>m>>x>>y;
memset(f,-1,sizeof(f));
bfs();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<f[i][j]<<" ";
cout<<endl;
}
}