马的遍历(BFS构造函数解法)

题目描述
有一个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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值