题目描述
有一个 𝑛×𝑚 的棋盘,在某个点 (𝑥,𝑦)上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 𝑛,𝑚,𝑥,𝑦。
输出格式
一个 𝑛×𝑚 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1)。
输入输出样例
输入
3 3 1 1
输出
0 3 2 3 -1 1 2 1 4
思路
看到这道题首先会想到用搜索,然而使用DFS(深度优先搜索)会TLE(因为DFS是找一条路走到底,就导致马儿将所有路线都走了一遍,十分浪费时间),就尝试使用BFS(广度优先搜索)。(注意:马可以向周围八个方向走)
答案
#include<iostream>
#include<queue>
using namespace std;
int n, m;
int vis[405][405];//用1和0来代表是否走过
int a[405][405];
int dx[8]={2,1,1,2,-1,-2,-2,-1};
int dy[8]={1,2,-2,-1,2,1,-1,-2};//马走日
queue<int> qx, qy, qs;
void BFS()
{
int x, y, step;
while(!qx.empty())
{
x = qx.front();
y = qy.front();
step = qs.front();
a[x][y] = step;
qx.pop();
qy.pop();
qs.pop();
for(int i = 0; i < 8; i++)
{
int tx = x + dx[i];
int ty = y + dy[i];
if(tx >= 1 && tx <= n && ty >= 1 && ty <= m && !vis[tx][ty])
{
vis[tx][ty] = 1;
qx.push(tx);
qy.push(ty);
qs.push(step + 1);
}
}
}
}
int main()
{
int x, y;
cin >> n >> m >> x >> y;
vis[x][y] = 1;//将起点标记为已经访问过
qx.push(x);
qy.push(y);
qs.push(0);
BFS();
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m;j ++)
{
if(!vis[i][j]) printf("%-5d", -1);
else
{
printf("%-5d", a[i][j]);
}
}
cout << endl;
}
return 0;
}