文章目录
简单的BFS模板题,开始我是做个N*M次BFS求起始点到终止点的次数,导致超时。结果发现一次BFS就可以搞定。
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式
一行四个数据,棋盘的大小和马的坐标
输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define MAX 400
using namespace std;
int dx[] = {2, -2, 2, -2, -1, 1, -1, 1}, dy[] = {1, 1, -1, -1, 2, 2, -2, -2};
struct Node {
int x;
int y;
int Step;
};
queue<Node> q;
int N, M, SX, SY;
int vis[MAX][MAX];
int result[MAX][MAX];
void BFS() {
Node cur;
cur.x = SX;
cur.y = SY;
cur.Step = 0;
vis[SX][SY] = 1;
q.push(cur);
while (!q.empty()) {
Node point = q.front();
q.pop();
for (int i = 0; i < 8; ++i) {
int nx = point.x + dx[i];
int ny = point.y + dy[i];
if (nx < 1 || nx > N || ny < 1 || ny > M || vis[nx][ny] == 1)
continue;
vis[nx][ny] = 1;
Node next;
next.x = nx;
next.y = ny;
next.Step = point.Step + 1;
result[next.x][next.y] = next.Step;
q.push(next);
}
}
}
int main() {
cin >> N >> M;
cin >> SX >> SY;
BFS();
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= M; ++j) {
if (i == SX && j == SY)
printf("%-5d", 0);
else if (!result[i][j])
printf("%-5d", -1);
else
printf("%-5d", result[i][j]);
}
cout << endl;
}
}