给定一个正整数 n, 不带前导零(例如,数字 04 不正确)。 在一个操作中,你可以删除给定整数的任何数字,使结果保持为不带前导零的正整数。 确定最少操作数,使最终的正整数成为完全平方数。如果不可能输出-1。c++代码
时间: 2023-06-25 12:08:23 浏览: 56
设有n个正整数,将他们连接成一排,组成一个最大的多位整数
可以使用广度优先搜索(BFS)来解决这个问题。从给定的数字 n 开始,我们可以通过删除任意数字来生成所有可能的数字,并检查是否为完全平方数。如果是,那么我们就找到了答案。否则,我们将这些数字添加到队列中,继续进行搜索。
下面是 C++ 代码实现:
```c++
#include <iostream>
#include <queue>
#include <unordered_set>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
queue<pair<int, int>> q; // 存储数字和步数
unordered_set<int> visited; // 存储已经访问过的数字
q.push({n, 0}); // 初始数字和步数为0
while (!q.empty()) {
int curr = q.front().first;
int steps = q.front().second;
q.pop();
if (sqrt(curr) == floor(sqrt(curr))) { // 如果当前数字是完全平方数
cout << steps << endl; // 输出步数
return 0;
}
// 生成所有可能的数字,并加入队列中
string str = to_string(curr);
for (int i = 0; i < str.size(); i++) {
string new_str = str.substr(0, i) + str.substr(i+1);
int new_num = stoi(new_str);
if (new_num != 0 && visited.count(new_num) == 0) {
visited.insert(new_num);
q.push({new_num, steps+1});
}
}
}
cout << "-1" << endl; // 如果搜索完所有可能的数字还没有找到完全平方数,则输出-1
return 0;
}
```
这个算法的时间复杂度为 O(n^2),其中 n 是数字 n 的位数。空间复杂度也为 O(n^2)。
阅读全文