马的遍历洛谷P1443

题目描述

有一个 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。

 分析

每一步的下一步都有可能有好几步,如果不越界或第一次达到该点,可以用queue储存,使用queue的方式遍历实现bfs。可以先将马走的地图(二维数组)全置为-1,第一个马的位置储存为0,所走到的下一个点,依次+1即可;

#include<bits/stdc++.h>
using namespace std;
int n, m, x, y,tx,ty, ans[405][405], bol[405][405];//ans[]储存步数情况,bol[]储存马是否走过
queue<int> qx,qy;//满足条件的马点[x,y]分开储存,但是用的时候一起用
int main()
{
	int mx[] = { 1,1,2,2,-1,-1,-2,-2 };//mx[],my[]储存马可能的走向(8种)
	int my[] = { 2,-2,1,-1,2,-2,1,-1 };
	memset(ans, -1, sizeof(ans));//初始化内存
	cin >> n >> m >> x >> y;
	ans[x][y] = 0;
	bol[x][y] = 1;//初始点初始化
	qx.push(x);//初始点入队
	qy.push(y);
	while (!qx.empty())//队列不空
	{
		for (int i = 0; i < 8; i++)
		{
			x = qx.front();//将队头取出
			y = qy.front();
			tx = x + mx[i];//tx:马点可能走过的点,下边if判定
			ty = y + my[i];
			if (bol[tx][ty] == 0 && tx > 0 && tx <= n && ty > 0 && ty <= m)
			{				
				ans[tx][ty] = ans[x][y] + 1;
				bol[tx][ty] = 1;
				qx.push(tx);
				qy.push(ty);
			}


		}
		qx.pop();//队头出队
		qy.pop();
	}
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= m; j++)
			{
				printf("%-5d", ans[i][j]);//输出结果
			}
			cout << endl;
		}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平烦..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值