酷代码 AI
菜单

你拥有对数字实施魔法的能力,有一天,你接到了一个任务。需要施展魔法,将正整数 a 变成正整数 b。你决定使用以下三种魔法,每一种魔法均可施展任意次: 1. 删除数a的个位,即a=a/10; 2. 在数a的末尾增加一个0,即a=a*10; 3. 将数a的个位修改为另一个数。 每施展一次魔法,均需消耗 K 单位能量。现想要知道,完成该任务,你最少消耗多少单位能量。 输入格式 输入共三行,依次为三个正整数 a, b, k。 输出格式 输出一个整数,代表最少消耗多少单位能量。 用C++

```cpp #include <iostream> #include <queue> #include <unordered_set> #include <climits> using namespace std; // 自定义结构体用于存储当前的数字和消耗的能量 struct Node { long long num; int energy; Node(long long n, int e) : num(n), energy(e) {} }; // 广度优先搜索函数,用于寻找最少消耗的能量 int bfs(long long a, long long b, int k) { queue<Node> q; unordered_set<long long> visited; // 将起始数字和消耗能量为0的节点加入队列 q.push(Node(a, 0)); visited.insert(a); while (!q.empty()) { Node current = q.front(); q.pop(); // 如果当前数字等于目标数字,返回消耗的能量 if (current.num == b) { return current.energy; } // 魔法1:删除数a的个位 if (current.num > 10) { long long newNum = current.num / 10; if (visited.find(newNum) == visited.end()) { q.push(Node(newNum, current.energy + k)); visited.insert(newNum); } } // 魔法2:在数a的末尾增加一个0 long long newNum2 = current.num * 10; if (visited.find(newNum2) == visited.end()) { q.push(Node(newNum2, current.energy + k)); visited.insert(newNum2); } // 魔法3:将数a的个位修改为另一个数 long long base = current.num / 10 * 10; for (int i = 0; i < 10; i++) { long long newNum3 = base + i; if (newNum3 > 0 && visited.find(newNum3) == visited.end()) { q.push(Node(newNum3, current.energy + k)); visited.insert(newNum3); } } } return -1; // 无法完成任务 } int main() { long long a, b; int k; // 读取输入 cin >> a >> b >> k; // 调用广度优先搜索函数 int result = bfs(a, b, k); cout << result << endl; return 0; } ``` 代码 1. 定义了一个结构体 `Node` 用于存储当前的数字和消耗的能量。 2. `bfs` 函数实现了广度优先搜索算法,使用队列和哈希集合来记录已访问的数字。 3. 在 `bfs` 函数中,分别实现了三种魔法操作,并将新生成的数字加入队列。 4. 如果找到目标数字,返回消耗的能量;如果队列为空仍未找到,返回 -1 表示无法完成任务。 5. `main` 函数读取输入,并调用 `bfs` 函数,最后输出结果。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 要注意数字可能会超出 `int` 类型的范围,因此使用 `long long` 类型来存储数字。 2. 在进行魔法操作时,要确保生成的新数字是正整数,避免出现非法数字。 3. 哈希集合的使用可以避免重复访问相同的数字,但是要注意插入和查找操作的性能,尤其是在处理大量数据时。 [2025-11-23 20:49:59 | AI写代码神器 | 812点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多