马的遍历

题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式
一行四个数据,棋盘的大小和马的坐标
输出格式
一个nm的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入
3 3 1 1
输出
0 3 2
3 -1 1
2 1 4
分析
这道题我们可以用广搜(BFS)
很简单,不会BFS的可以参考
骑士旅行(BFS)

AC代码

#include<iostream> #include<cstdio> int n,m,x1,y1,head,tail,a[405][405],b[405][405],st[160005][3]; int dx[9]={ 0,1,1,-1,-1,2,2,-2,-2};//八个方向 int dy[9]={ 0,2,-2,2,-2,1,-1,1,-1}; void bfs() {  while(head<tail)//BFS模板 {  head++; for(int i=1;i<=8;i++)//八个方向 {  int x=st[head][0]+dx[i],y=st[head][1]+dy[i]; if(x>=1&&x<=n&&y>=1&&y<=m)//是否出界 if(a[x][y]==0)//是否被标记过 {  tail++; a[x][y]=1;//标记 b[x][y]=st[tail][2]=st[head][2]+1;//赋值 st[tail][0]=x;//更新坐标 st[tail][1]=y; } } } } using namespace std; int main() {  cin>>n>>m; cin>>x1>>y1; a[x1][y1]=1;//标记 st[1][0]=x1;st[1][1]=y1;//坐标 tail=1;//初值 bfs(); for(int i=1;i<=n;i++) {  for(int j=1;j<=m;j++) if(a[i][j]!=0)printf("%-5d",b[i][j]);//输出需要 else printf("%-5d",-1); cout<<endl; } } 

谢谢