2510: 【普及/提高-】【P1443】马的遍历
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:19
解决:7
题目描述
有一个 的棋盘,在某个点 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入
输入只有一行四个整数,分别为 。
输出
一个 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 )。
样例输入 复制
3 3 1 1
样例输出 复制
0 3 2
3 -1 1
2 1 4
提示
数据规模与约定
对于全部的测试点,保证 ,。
#include<bits/stdc++.h>
using namespace std;
#define maxn 310
struct coord { //一个结构体存储x,y两个坐标
int x, y;
};
queue<coord> Q;//队列
int ans[maxn][maxn];//记录答案,-1表示未访问
int walk[8][2] = {{2, 1}, {1, 2}, {-1, 2}, {-2, 1},{-2, -1}, {-1, -2}, {1, -2}, {2, -1}};
int main(){
int n,m,sx,sy;
memset(ans,-1,sizeof(ans));
cin>>n>>m>>sx>>sy;
coord tmp = {sx, sy};
Q.push(tmp); // 使起点入队扩展
ans[sx][sy] = 0;
while (!Q.empty()) { // 循环直到队列为空
coord u = Q.front(); // 拿出队首以扩展
int ux = u.x, uy = u.y;
Q.pop();
for (int k = 0; k < 8; k++) {
int x = ux + walk[k][0], y = uy + walk[k][1];
int d = ans[ux][uy];
if (x < 1 || x > n || y < 1 || y > m || ans[x][y] != -1)
continue; // 若坐标超过地图范围或者该点已被访问过则无需入队
ans[x][y] = d + 1; // 记录答案,是上一个点多走一步的结果。
coord tmp = {x, y};
Q.push(tmp);
}
}
for (int i=1;i<=n;i++,puts(""))
for (int j=1;j<=m;j++)
printf("%-5d",ans[i][j]); //场宽输出
return 0;
}