_**马的遍历**_
#include<bits/stdc++.h>
using namespace std;
const int N = 410;
typedef pair<int, int> PII;
#define x first
#define y second
int n, m, x2, y2;
int dist[N][N];//存 马走到各个点的距离
queue<PII> q;
int dx[] = {1,-1,-2,-2,-1,1,2,2};
int dy[] = {-2,-2,-1,1,2,2,1,-1};
void bfs(int x1, int y1)
{
memset(dist, -1, sizeof dist);//初始化dist[]数组为-1
q.push({x1, y1});//先把所在位置放进队列
dist[x1][y1] = 0;//所在位置的 dist 为 0
while(!q.empty())//循坏条件队列不为空
{
auto t = q.front();//取出对头
q.pop();//弹出多头队头
{
for(int i=0; i<8; i++)//遍历8个方向
{
int a = t.x+dx[i], b = t.y+dy[i];//x,y坐标
if(a<1 || a>n || b<1 || b>m)//判断是否出界
continue;
if(dist[a][b] >=0)//判断是否走过
continue;
dist[a][b] = dist[t.x][t.y] + 1;//没走过前一个位置距离+1
q.push({a,b});//进队
}
}
}
}
int main()
{
cin >> n >> m >> x2 >> y2;
bfs(x2, y2);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
printf("%-5d", dist[i][j]);//重点左对齐
}
printf("\n");
}
return 0;
}