题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式
一行四个数据,棋盘的大小和马的坐标
输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入
3 3 1 1
输出
0 3 2
3 -1 1
2 1 4
分析:到某个点最少要走几步,很明显是一个BFS问题,定好起点,用宽搜搜索,搜到的地方将步数打印到地图中,没有搜到的地方输出-1即可;
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct Node{
int x;
int y;
int step;
Node(int xx,int yy,int sstep){//用构造函数记录状态
x=xx;
y=yy;
step=sstep;
}
};
int mp[405][405];
bool vis[405][405];
int vir[8][2]={{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1}};//马的走法
int main(){
int n,m,x0,y0;
queue<Node>hos;
memset(mp,0,sizeof(mp));//将数组初始化为零
scanf("%d %d %d %d",&n,&m,&x0,&y0);
x0--;
y0--;
hos.push(Node(x0,y0,0));//将起点压入队列中
vis[x0][y0]=true;
while(!hos.empty()){
Node now=hos.front();
for(int i=0;i<8;i++){//遍历周围点
int tx=now.x+vir[i][0];
int ty=now.y+vir[i][1];
int step=now.step;
if(!vis[tx][ty]&&tx>=0&&tx<n&&ty>=0&&ty<m){
hos.push(Node(tx,ty,step+1));//将附近点压入
mp[tx][ty]=step+1;//将步数打印到地图上
vis[tx][ty]=true;
}
}
hos.pop();//任务完成弹出
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!vis[i][j]){
printf("%-5d",-1);
}else{
printf("%-5d",mp[i][j]);
}
}
printf("\n");
}
return 0;
}