题目描述
有一个 �×�n×m 的棋盘,在某个点 (�,�)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 �,�,�,�n,m,x,y。
输出格式
一个 �×�n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1−1)。
输入输出样例
输入 #1复制
3 3 1 1
输出 #1复制
0 3 2 3 -1 1 2 1 4
代码:
#include<stdio.h>
int a[401][401]={0},b[401][401]={0},n,m,t,sx,x[100000],y[100000],d[100000]={0},e;
int dy[]={-2,-2,-1,1,2, 2, 1,-1};//马的八个走向
int dx[]={-1, 1, 2,2,1,-1,-2,-2};
void kk(int i,int j)
{int tx,ty;
x[1]=i;y[1]=j;e=2;//队列的头建立
for(int k=1;k<e;k++)//k的后面不一定就是e
for(sx=0;sx<8;sx++)
{tx=x[k]+dx[sx];
ty=y[k]+dy[sx];
if(tx>0&&tx<=n&&ty>0&&ty<=m&&a[tx][ty]==0)
{a[tx][ty]=1;//确保不重复走
x[e]=tx;
y[e]=ty;
d[e]=d[k]+1;//k下标是e下标上一个位置
e++;
}
}
for(int k=1;k<e;k++)b[x[k]][y[k]]=d[k];//给数组赋值
}
main()
{
int i=0,j,x,y;
scanf("%d %d %d %d",&n,&m,&x,&y);
b[x][y]=0;//开始一定要赋值
a[x][y]=1;
kk(x,y);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[i][j]==0)
printf("%-5d",-1);
else printf("%-5d",b[i][j]);
}printf("\n");
}
}