题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入输出格式
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入样例#1:
4 4 2 2
输出样例#1:
4 3 2 1 3 0 3 2 2 3 2 1 1 2 1 4
AC_CODE:
#include<bits/stdc++.h>
using namespace std;
int dx[8]{ 2,2,-2,-2,1,1,-1,-1 };
int dy[8]{ 1,-1,1,-1,2,-2,2,-2 };
int mp[1000][1000];
int n, m;
int stx, sty;
struct Node
{
int x; int y;
Node(int xx, int yy) :x(xx), y(yy) {};
};
void BFS(int x, int y)
{
queue<Node> mq;
mq.push(Node(x, y));
while (!mq.empty())
{
int ux = mq.front().x;
int uy = mq.front().y;
for (int i = 0; i < 8; ++i)
{
int xx = ux + dx[i];
int yy = uy + dy[i];
if (mp[xx][yy]==-1)
{
mp[xx][yy] =mp[ux][uy]+1;
mq.push(Node(xx, yy));
}
}
mq.pop();
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i)
{
for (int j = 1;j <= m; ++j)
{
mp[i][j] = -1;
}
}
cin >> stx >> sty;
mp[stx][sty] = 0;
BFS(stx, sty);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
printf("%-5d", mp[i][j]);//注意场宽 我在这被卡了两次= =
printf("\n");
}
}