2. 马的遍历
题目ID:9563必做题100分
最新提交:
Wrong Answer
0 分
历史最高:
Wrong Answer
0 分
时间限制: 1000ms
空间限制: 131072kB
题目描述
时间限制:1s 空间限制:128M
题目描述:
有一个 n×m 的棋盘,在某个点 (x, y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式:
一行四个数据,分别为 n, m, x, y,代表棋盘的大小和马的坐标。 (1 ≤ x ≤ n ≤ 400, 1 ≤ y ≤ m ≤ 400)
输出格式:
一个 n*m 的矩阵,代表马到达某个点最少要走的步数(不能到达的位置输出 -1)
[image]
样例输入:
3 3 1 1
样例输出:
0 3 2 3 -1 1 2 1 4
#include<bits/stdc++.h>
using namespace std;
int maxa = 0, fx[8]={2,1,1,2,-2,-1,-1,-2 }, fy[8]={-1,-2,2,1,-1,-2,2,1}, a, s, l[410][410] = {},x,y;
int o[410][410];
queue<int>q;
void bfs() {
while (!q.empty()) {
x = q.front();
q.pop();
y = q.front();
q.pop();
for (int i = 0; i < 8; i++) {
int xx = x + fx[i], yy = y + fy[i];
if (xx>=1&&yy>=1&&xx<a&&yy<s&&o[xx][yy]==-1) {
o[xx][yy] = o[xx][yy]+1;
q.push(xx);
q.push(yy);
}
}
}
}
int main()
{
cin >> a >> s >> x >> y;
memset(o, -1, sizeof o);
o[x][y]=0;
q.push(x);
q.push(y);
bfs();
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= s; j++) {
cout << o[i][j]<<" ";
}
cout << endl;
}
return 0;
}