题目描述
有一个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; }