题目:https://www.luogu.com.cn/problem/P1443
马的遍历
题目描述
有一个 n × m 的棋盘,在某个点 (x, y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。(马走日,象走田)
输入格式
输入只有一行四个整数,分别为 n, m, x, y。
输出格式
一个 n × m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 -1)。
样例
样例输入
```
3 3 1 1
```
样例输出
```
0 3 2
3 -1 1
2 1 4
```
提示
数据规模与约定
对于全部的测试点,保证 1 <= x <= n <= 400,1 <= y <= m <= 400。
代码:
#include<bits/stdc++.h>
using namespace std;
int dx[8]={-2,-2,-1,-1,1,1,2,2};//马走日,有八个方向
int dy[8]={1,-1,2,-2,2,-2,1,-1};
int n,m,tx,ty;//tx,ty是起点
int sum[410][410];//储存到达每个位置的步数
struct node
{
int x;//记录行
int y;//纪录列
int t;//记录步数
}horse;
queue<node>box;//储存每个可以走到的位置
int main()
{
memset(sum,-1,sizeof(sum));//初始化为1,无法到达的点为-1
cin>>n>>m>>tx>>ty;
sum[tx][ty]=0;//起点步数为0
box.push((node){tx,ty,0});//起点入队
while(!box.empty())
{
horse.x=box.front().x;//记录当前位置信息
horse.y=box.front().y;
horse.t=box.front().t;
box.pop();//记录后出队
for(int i=0;i<8;i++)//向八个方向出队
{
int sx,sy,st;//下一方向坐标和步数
sx=horse.x+dx[i];//行坐标
sy=horse.y+dy[i];//列坐标
if(sx>0&&sy>0&&sx<=n&&sy<=m&&sum[sx][sy]==-1)//判断是否越界或是否走过该点
{
sum[sx][sy]=horse.t+1;
st=horse.t+1;
box.push((node){sx,sy,st});//该点入队
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<left<<setw(5)<<sum[i][j];
}
cout<<endl;
}
return 0;
}