P1443 马的遍历(BFS)

    科技2022-09-01  122

    文章目录

    简单的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; } }
    Processed: 0.008, SQL: 10