题目描述
有一个n*m的棋盘
在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入输出格式
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入样例#1: 复制
3 3 1 1
输出样例#1: 复制
0 3 2
3 -1 1
2 1 4
一直以为自己不会BFS的 尴尬了 BFS 的模板
#include<bits/stdc++.h>
using namespace std;
#define maxn 400+100
int a[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
int c[maxn][maxn];
bool fa[maxn][maxn];
int m,n;
struct ac{
int x,y;
}b[maxn];
queue<ac>q;
void BFS(int sx,int sy){
ac w;
w.x=sx; w.y=sy;
q.push(w);
while(!q.empty()){
w=q.front();
q.pop();
for(int j=0;j<8;j++){
ac e=w;
e.x+=a[j][0];
e.y+=a[j][1];
if(e.x>n||e.y>m||e.x<1||e.y<1||fa[e.x][e.y])
continue;
c[e.x][e.y]=c[w.x][w.y]+1;
fa[e.x][e.y]=1;
q.push(e);
}
}
}
int main(){
int x,y;
cin>>n>>m>>x>>y;
memset(c,-1,sizeof(c));
memset(fa,0,sizeof(fa));
fa[x][y]=1;
c[x][y]=0;
BFS(x,y);
for(int j=1;j<=n;j++){
for(int k=1;k<=m;k++){
printf("%-5d",c[j][k]);
}
cout<<endl;
}
return 0;
}