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