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

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

1个月前 (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. 最大步数限制提升鲁棒性。

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


原创内容 转载请注明出处

分享给朋友:

相关文章

2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略

2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略

一、题目解读    2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

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

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

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

牛客232639题解析:双指针+排序算法高效求解三角形数量(附代码详解)

牛客232639题解析:双指针+排序算法高效求解三角形数量(附代码详解)

一、题目解读牛客232639题要求计算一个整数数组中能够组成有效三角形的三边组合数量。根据三角形不等式,三边需满足任意两边之和大于第三边。例如,数组[3, 4, 5, 6]可组成两个有效三角形([3,...

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

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

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

牛客4577题解:滑动窗口解法

牛客4577题解:滑动窗口解法

一、题目解读牛客4577题要求处理多组测试数据,每组包含一个整数数组crimes和两个参数n(数组长度)、t(阈值)、c(窗口大小)。题目需要统计数组中所有长度恰好为c的子数组,其元素和不超过t的数量...

发表评论

访客

看不清,换一张

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