C++使用广度优先搜索完成这个题目:991. 坏了的计算器 中等 173 相关企业 在显示着数字 startValue 的坏计算器上,我们可以执行以下两种操作: 双倍(Double):将显示屏上的数字乘 2; 递减(Decrement):将显示屏上的数字减 1 。 给定两个整数 startValue 和 target 。返回显示数字 target 所需的最小操作数。 示例 1: 输入:startValue = 2, target = 3 输出:2 解释:先进行双倍运算,然后再进行递减运算 {2 -> 4 -> 3}. 示例 2: 输入:startValue = 5, target = 8 输出:2 解释:先递减,再双倍 {5 -> 4 -> 8}.
时间: 2024-03-08 15:49:43 浏览: 81
好的,这道题可以使用广度优先搜索(BFS)来解决。我们可以把当前数字作为一个状态,然后每次执行双倍或递减操作会生成一个新的状态。我们可以从初始状态 startValue 开始,不断生成新的状态,直到生成 target 状态为止。在这个过程中,我们需要记录每个状态的深度,也就是执行了多少次操作。
具体的实现步骤如下:
1. 定义一个队列,初始将 startValue 加入队列,并将其深度设为 0。
2. 不断从队列中取出队首元素,判断其是否等于 target。如果相等,返回其深度。
3. 如果不相等,将其进行双倍或递减操作,生成新的状态,并将其深度设为当前状态深度加 1,将新状态加入队列中。
4. 重复步骤 2 和步骤 3,直到找到 target 状态。
下面是实现的 C++ 代码:
```c++
#include <queue>
using namespace std;
class Solution {
public:
int brokenCalc(int startValue, int target) {
queue<pair<int, int>> q;
q.push({startValue, 0}); // 将初始状态加入队列
while (!q.empty()) {
int cur = q.front().first; // 取出队首元素
int depth = q.front().second;
q.pop();
if (cur == target) { // 如果当前状态等于目标状态,返回其深度
return depth;
}
if (cur < target) { // 双倍操作
q.push({cur * 2, depth + 1});
}
q.push({cur - 1, depth + 1}); // 递减操作
}
return -1; // 如果无法达到目标状态,返回 -1
}
};
```
阅读全文