洛谷P1443 马的遍历(bfs广搜的基本应用)

这个问题呢是bfs的入门题,向较于dfs深搜,广搜的时间复杂度会降低一些,因为dfs是找不到一个解不回头,而bfs是找最优解,所以这就是两者的区别

如果想掌握bfs,前提是有dfs的基础和会用队列

那这道题就是bfs的模板题目了代码如下:

#include <iostream>
#include <queue>
#include <utility>
#include <cstring>
using namespace std;

int n, m, x, y;
int walk[8][2] = {{-1, 2}, {1, 2}, {-2, 1}, {2, 1}, {-1, -2}, {1, -2}, {-2, -1}, {2, -1}};
int a[410][410];
bool b[410][410];
pair<int, int> p;
queue<pair<int, int> > q;

int main() {
    cin >> n >> m >> x >> y;
    memset(a, -1, sizeof(a));
    memset(b, false, sizeof(b));
    p.first = x, p.second = y;
    q.push(p);

    while (!q.empty()) {
        p = q.front();
        q.pop();
        if (b[p.first][p.second]) continue;
        if (p.first == x && p.second == y) {
            a[p.first][p.second] = 0;
        }
        b[p.first][p.second] = true;
        for (int i = 0; i < 8; i++) {
            int nx = p.first + walk[i][0], ny = p.second + walk[i][1];
            if (nx < 1 || nx > n || ny < 1 || ny > m) continue; // 修正了边界检查,使索引从 1 开始
            if (b[nx][ny]) continue;
			a[nx][ny] = a[p.first][p.second] + 1;
			q.push(make_pair(nx, ny));
        }
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

当队列为空时,说明所有格子都走过了,那么循环结束,起始点和边界一定要处理好,代码一定要自己去多敲几遍,上述只是模板,真正掌握还是要去多刷题

加油

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值