马的遍历
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式
一行四个数据,棋盘的大小和马的坐标
输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(不能到达则输出-1)
样例
样例输入
3 3 1 1
样例输出
0 3 2
3 -1 1
2 1 4
c++AC代码
#include<bits/stdc++.h>
using namespace std;
bool flag[1005][1005];
int n,m,x,y,a[1005][1005];
int dir[8][2]={{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1}};
struct node{
int x,y;
}t1,t2;
inline void bfs(int x,int y){
queue<node> q;
t1.x=x,t1.y=y;
flag[x][y]=true;
q.push(t1);
while(!q.empty()){
t1=q.front();
q.pop();
for(int i=0;i<=7;i++){
int dx=t1.x+dir[i][0],dy=t1.y+dir[i][1];
if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&!flag[dx][dy]){
t2.x=dx,t2.y=dy;
flag[dx][dy]=true;
a[dx][dy]=a[t1.x][t1.y]+1;
q.push(t2);
}
}
}
}
int main(){
memset(a,-1,sizeof(a));
cin>>n>>m>>x>>y;
a[x][y]=0;
bfs(x,y);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}