今年以来,发现以前很多“不可做”的题现在都变得简单起来了。(是不是因为我太蒻了)
尤其是像“马的遍历”这样的题。(别欺负小蒟蒻不会用队列QAQ)
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[401][401];//存储答案
int n,m,sx,sy;
int movex[8]={2,2,1,-1,-2,-2,-1,1},movey[8]={-1,1,2,2,1,-1,-2,-2};//马走“日”
int qx[160001],qy[160001],k[160001];
int xyds=1;
void bfs(int step)
{
if(k[step-1]==xyds) return;
k[step]=xyds;
int djy=xyds;
for(int i=k[step-1];i<djy;i++){
for(int j=0;j<=7;j++){//尝试8个方向
int x=qx[i]+movex[j],y=qy[i]+movey[j];
if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]==-1){
a[x][y]=step;//存储步数
qx[xyds]=x;
qy[xyds]=y;//存储位置
xyds++;
}
}
}
bfs(step+1);
}
int main()
{
memset(a,-1,sizeof(a));
scanf("%d%d%d%d",&n,&m,&sx,&sy);
a[sx][sy]=0;
qx[0]=sx;
qy[0]=sy;
bfs(1);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) printf("%-5d",a[i][j]);//左对齐输出
printf("\n");
}
return 0;
}