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

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

3小时前

牛客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. 最大步数限制提升鲁棒性。

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


原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

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

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

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

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

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

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

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

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

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

牛客13278题详解:句子单词反转(C++实现)

牛客13278题详解:句子单词反转(C++实现)

一、题目解读牛客13278题要求编写函数实现句子中单词顺序的反转,例如将"Hello World"转换为"World Hello"。需注意处理首尾空格、单词间空...

力扣2588题解:利用前缀异或和与哈希表求解美丽子数组问题

力扣2588题解:利用前缀异或和与哈希表求解美丽子数组问题

一、题目解读力扣2588题要求计算给定数组中“美丽子数组”的数量。所谓“美丽子数组”,是指子数组的异或和为0。题目关键在于理解子数组异或和的性质,并通过高效算法统计符合条件的子数组数量。二、解题思路采...

发表评论

访客

看不清,换一张

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