题目描述
有一个 n×m 的棋盘,在某个点(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
题目限制
输入格式
输入只有一行四个整数,分别为n,m,x,y。
输出格式
一个n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1)。
输入输出样例
解题思路
本题为一个简单的BFS问题,具体思路见代码
AC代码
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y;
int dx[9]={0,-1,-2,-2,-1,1,2,2,1}; //8个方向,x轴的改变
int dy[9]={0,2,1,-1,-2,2,1,-1,-2}; //8个方向,y轴的改变
int v[405][405]; //标记
int f[405][405]; //记录步数
void bfs();
int main()
{
cin>>n>>m>>x>>y;
memset(v,0,sizeof(v));
memset(f,-1,sizeof(f)); //不能到达输出-1,所以直接初始为-1
bfs();
return 0;
}
void bfs()
{
f[x][y]=0;
queue<pair<int,int> >q; //在嵌套模板实参列表中应当使用‘> >’而非‘>>’
q.push(make_pair(x,y));
v[x][y]=1;
while(!q.empty())
{
x=q.front().first;
y=q.front().second;//取队首
q.pop(); //已取得队首,出队
for(int i=1;i<=8;i++)
{
int nx=x+dx[i],ny=y+dy[i]; //记录下一步坐标
if(nx<1||nx>n||ny<1||ny>m||v[nx][ny]==1) //出界或走过就跳过
continue;
v[nx][ny]=1;
q.push(make_pair(nx,ny));
f[nx][ny]=f[x][y]+1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
printf("%-5d",f[i][j]); //依次输出
}
cout<<'\n';
}
}