题目描述
有一个 n×m 的棋盘,在某个点 (x, y)上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 n, m, x, y
输出格式
一个 n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出-1)。
输入输出样例
输入 #1
3 3 1 1
输出 #1
0 3 2
3 -1 1
2 1 4
说明/提示
数据规模与约定
对于全部的测试点,保证1≤x≤n≤400,1≤y≤m≤400。
思路:这是一个dfs类型的题目,要依次遍历每一个可以走到的位置,去计算该位置能找到的位置,并重复该行为,直至全部能走到的位置都已经遍历一次。
代码:
#include<bits/stdc++.h>
using namespace std;
const int n=400;
struct node{
int x,y,step;
}que[n*n];//记录马的位置,以及走到这里的步数
int main(){
void bfs(int,int,int,int);
int n,m,x,y;
cin>>n>>m>>x>>y;
bfs(x,y,n,m);
return 0;
}
void bfs(int x1,int y1,int n,int m){
int a[400][400]={};
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=-1;//确保未经过的点步数输出为-1
}
}
a[x1][y1]=0;
int head=0,tail=0;
que[0].x=x1;
que[0].y=y1;
que[0].step=0;
int ne[8][2]={2,1,2,-1,-2,1,-2,-1,1,2,1,-2,-1,2,-1,-2};//马能走到的8个位置
while(tail>=head){
for(int i=0;i<8;i++){
int tx=que[head].x+ne[i][0];
int ty=que[head].y+ne[i][1];
if(a[tx][ty]==-1&&tx>0&&tx<=n&&ty>0&&ty<=m){//确保不能超出边界
que[++tail].x=tx;
que[tail].y=ty;
que[tail].step=que[head].step+1;
a[tx][ty]=que[head].step+1;
}
}
head++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}