当前位置:首页 > 牛客 > 牛客12546题:广度优先搜索(BFS)解法解决饥饿的小易问题

牛客12546题:广度优先搜索(BFS)解法解决饥饿的小易问题

7个月前 (08-10)

牛客12546题:广度优先搜索(BFS)解法解决饥饿的小易问题 牛客题解 广度优先搜索 队列 哈希表 BFS 广搜 最短路径 第1张

一、题目解读

牛客12546题是一道典型的数学问题,要求通过给定的数学变换规则(即 x -> (4x+3) % MOD 和 x -> (8x+7) % MOD),从初始位置 x0 出发,寻找到达目标位置(即 x % MOD == 0)的最小步数。题目考察了算法设计中的搜索策略与状态优化,需要高效地遍历状态空间并避免重复计算。

二、解题思路

解题的核心在于采用广度优先搜索BFS)算法。由于题目要求找到最短路径,BFS天然适合解决此类问题:它按层遍历,确保第一次到达目标状态时的步数即为最小步数。

关键在于:

1. 使用队列存储待扩展的状态(位置+步数)。

2. 哈希表(unordered_map)记录已访问位置,避免重复遍历。

3. 对每个位置生成两个子状态,检查合法性后入队。

4. 设置最大步数限制(MAX_STEPS)防止超时,超出则终止搜索。

5. 终止条件:当位置 x 满足 x % MOD == 0 时,立即输出步数。

三、解题步骤

1. 初始化:将初始位置 x0 入队,标记为已访问,步数为0。

2. 循环扩展:

○ 弹出队首元素 (x, steps)。

○ 计算两个新位置 next1 = (4x+3) % MOD 和 next2 = (8x+7) % MOD。

○ 若新位置未被访问且步数未超限,标记并加入队列(步数+1)。

3. 终止判断:若当前位置满足目标条件,输出步数并结束;若队列为空且未找到目标,输出-1。

四、代码与注释

#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;

const long long MOD = 1000000007;  // 模数
const int MAX_STEPS = 100000;     // 最大步数限制

int main() {
    long long x0;
    cin >> x0;                   // 输入初始位置

    queue<pair<long long, int>> q;   // 存储位置-步数对
    unordered_map<long long, bool> visited;  // 记录已访问位置

    q.push({x0, 0});               // 初始状态入队
    visited[x0] = true;            // 标记已访问

    while (!q.empty()) {
        auto current = q.front();   // 获取队首元素
        q.pop();

        long long x = current.first;   // 当前位置
        int steps = current.second;    // 当前步数

        // 目标状态判断
        if (x % MOD == 0) {
            cout << steps << endl;  // 输出最小步数
            return 0;
        }

        // 步数超限,跳过
        if (steps >= MAX_STEPS) {
            continue;
        }

        // 生成两个新位置
        long long next1 = (4 * x + 3) % MOD;
        long long next2 = (8 * x + 7) % MOD;

        // 检查并扩展新状态
        if (!visited[next1]) {
            visited[next1] = true;
            q.push({next1, steps + 1});
        }
        if (!visited[next2]) {
            visited[next2] = true;
            q.push({next2, steps + 1});
        }
    }

    // 未找到目标,输出-1
    cout << -1 << endl;
    return 0;
}

注释说明:

● MOD 为模数,避免整数溢出。

● MAX_STEPS 限制搜索深度,防止无限循环。

● visited 哈希表优化时间复杂度至O(n),避免重复计算。

● 双状态生成 (4x+3) 和 (8x+7) 符合题目规则。

五、总结

该解法通过BFS结合哈希表,实现了高效的状态遍历与去重,时间复杂度为O(n),空间复杂度为O(n)。优化点包括:

1. 明确终止条件,避免无效搜索。

2. 模运算确保状态合法性。

3. 最大步数限制提升鲁棒性。

适用于求解最短路径类问题,为同类算法设计提供了参考模板。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

手把手教你实现哈希表:从代码到原理的新手友好指南

一、简介和应用哈希表(Hash Table)是一种高效的数据结构,通过哈希函数将键(Key)映射到存储位置,实现O(1)时间复杂度的查找、插入和删除操作。它广泛应用于缓存系统、数据库索引、字典查询等场...

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

一、题目解读洛谷1363题要求判断在给定大小的循环迷宫中,从起点出发是否可以通过移动到达多个不同的路径方向。迷宫由字符矩阵表示,'S'为起点,'#'为障碍物,其余为可通...

牛客4432题解题全解析:矩阵快速幂优化楼梯攀登问题(附C++代码)

牛客4432题解题全解析:矩阵快速幂优化楼梯攀登问题(附C++代码)

一、题目解读牛客4432题要求计算在n阶楼梯中,每次可爬1阶或2阶,共有多少种不同的攀登方式。该问题属于经典的动态规划类题目,需通过数学递推或矩阵乘法优化算法以应对较大数据规模。题目核心在于寻找高效计...

洛谷P3694题解:动态规划与状态压缩优化解题全解析

洛谷P3694题解:动态规划与状态压缩优化解题全解析

一、题目解读洛谷P3694题要求解决一个多团队人数分配问题,给定n个元素和m个团队,每个元素属于一个团队,需将元素重新排列,使相邻元素属于不同团队,并最小化调整次数。题目难点在于如何高效处理团队间的空...

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

一、题目解读洛谷P1141题目要求处理一个由字符构成的迷宫,其中相同字符形成连通块,不同字符构成分隔。题目需统计连通块数量及大小,并支持查询两点是否属于同一连通块。核心在于高效识别并标记迷宫中的连通区...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。