题目描述
48: 组合三位数之一
时间限制: 1 Sec 内存限制: 128 MB
提交: 5197 解决: 3705
把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。
输入
无
输出
按从小到大的顺序输出这三个三位数,由空格隔开。输出占一行。
代码注释
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
string str;
int flag; // 看后面的代码
int first = 1; // 同上
// 确保平方后是三位数,可以从 11 的平方开始
for (int i = 11; i <= 31; i++) {
str += to_string(i * i); // 将 i * i 的结果变为 字符串
for (int j = 11; j <= 31; j++) {
// 把当前的 str 备份到 str2
string str2 = str;
str += to_string(j * j);
for (int k = 11; k <= 31; k++) {
string str3 = str; // // 把当前的 str 备份到 str3
str += to_string(k * k);
flag = 1;
for (int m = 1; m <= 9; m++) {
string temp = to_string(m);
if (str.find(temp) == string::npos) { // 检查是否包含 1~9 这 9 个数字
flag = 0;
break;
}
} // 检查通过的话,flag 还是 1。同时结果有多组,只需要输出第一组就好了。
if (flag == 1 && first == 1) { // 从 str 中依次截取 3 个字符,并都转换成 数字
//cout << str.substr(0, 3) << str.substr(3, 3) << str.substr(6, 3) << endl;
int arr[3] = { stoi(str.substr(0, 3)), stoi(str.substr(3, 3)), stoi(str.substr(6,3)) };
sort(arr, arr + 3); // 排序
cout << arr[0] << " " << arr[1] << " " << arr[2] << endl;
first = 0; // first 赋值为 0 后,后面的几组就不重复输出了
}
str = str3;
}
// 用备份的 str2 重置 str,用于作为下一个循环的初始 str
str = str2;
}
str.clear();
}
return 0;
}
oj 很给力
多刷oj,在实战中成长……