洛谷P1443 马的遍历——广搜

题目描述

有一个n×m 的棋盘,在某个点 (x, y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为 n, m, x, y。

输出格式

一个n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1)。

输入输出样例

输入 

3 3 1 1

输出 

0    3    2    
3    -1   1    
2    1    4    

说明/提示

数据规模与约定

对于全部的测试点,保证1≤x≤n≤400,1≤y≤m≤400。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

int n, m, sx, sy;
int mp[410][410];
int xx[] = { 2,2, 1, 1,-1,-1,-2,-2 };
int yy[] = { 1,-1,2,-2, 2,-2,1,-1 };
struct node
{
	int x, y, s;
};
int main()
{
	cin >> n >> m >> sx >> sy;
	memset(mp, -1, sizeof(mp));
	queue<node>q;
	node t;
	t.x = sx; t.y = sy; t.s = 0;
	q.push(node{ sx,sy,0 });
	mp[sx][sy] = 0;
	while (!q.empty())
	{
		for (int i = 0; i < 8; i++)
		{
			int dx = xx[i] + q.front().x;
			int dy = yy[i] + q.front().y;
			if (dx >= 1 && dx <= n && dy >= 1 && dy <= m && mp[dx][dy] == -1)
			{
				q.push(node { dx, dy, q.front().s + 1 });
				mp[dx][dy] = q.front().s + 1;
			}
		}
		q.pop();
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			printf("-5%d", mp[i][j]);
		}
		cout << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_73648729/article/details/129351941