zl程序教程

您现在的位置是:首页 >  后端

当前栏目

马的遍历.

2023-09-27 14:26:25 时间

题目描述
​ 有一个 n 行 m 列的棋盘( 1<n,m≤400 ),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入
​ 一行四个整数,分别表示棋盘大小 n,m 和马的位置 x,y。

输出
​ 一个 n∗m​ 的矩阵,代表马到达某个点最少要走几步,每两个数之间用空格隔开,若此点不可达则输出 −1​。

样例输入
3 3 1 1
样例输出
0 3 2
3 -1 1
2 1 4
数据规模与约定
​ 时间限制:1 s

​ 内存限制:256 M

​ 100% 的数据保证 1<n,m≤400

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

struct node {
	int x, y, cnt;
};
int dir[8][2] = { 1,2,2,1,1,-2,-2,1,-1,2,2,-1,-1,-2,-2,-1};
int main() {
	int n, m, x, y;
	cin >> n >> m >> x >> y;
	int num[405][405];
	memset(num, -1, sizeof(int) * 405 * 405);
	queue<node> que;
	que.push({ x,y,0 });
	num[x][y] = 0;
	while (!que.empty()) {
		node temp = que.front();
		que.pop();
		for (int i = 0; i < 8; i++) {
			int x = temp.x + dir[i][0];
			int y = temp.y + dir[i][1];
			if (x <= 0 || y <= 0 || x > n || y > m) {
				continue;
			}
			if (num[x][y] == -1) {
				que.push({ x,y,temp.cnt + 1 });
				num[x][y] = temp.cnt + 1;
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (j != 1) cout << " ";
			cout << num[i][j];
		}
		cout << endl;
	}
	return 0;
}