[C++] 纯文本查看 复制代码 #include<bits/stdc++.h>
int n,m,nx,ny;
int res[405][405];//res表示最终输出结果,下标代表棋盘位置,值代表最少步数
int x[8]={1,2,-1,-2,-1,-2,1,2};
int y[8]={2,1,2,1,-2,-1,-2,-1};
struct queue{
int x,y;
}a[40010];//构建bfs的队列(用数组表示)
void bfs(int i,int j)
{
int head=1,tail=2;
a[2].x=i,a[2].y=j;
res[i][j]=0;//初始位置的最少步数为0
while(head<tail)
{
head++;
for(int q=0;q<8;q++)
{
//(xx,yy)表示目前马走到的位置,还有。。。~~变量名真的好难取~~
int xx=a[head].x+x[q];
int yy=a[head].y+y[q];
if((res[xx][yy]==-1) && xx>=1 && xx<=n && yy>=1 && yy<=m)//判断是否走过,是否越界
{
tail++;
res[xx][yy]=res[a[head].x][a[head].y]+1;//最少步数加一
a[tail].x=xx;
a[tail].y=yy;
}
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&nx,&ny);
memset(res,-1,sizeof res);
bfs(nx,ny);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
printf("%-5d",res[i][j]);
}
printf("\n");
}
}
|