题目来源:三连击(升级版) - 洛谷
参考书目:《深入浅出程序设计竞赛(基础篇)》
解题思路:这道题和上一篇一样,考察next_permutation函数的使用。通过next_permutation函数
遍历 1
到 9
的所有排列,然后基于这些排列构建三位数,检查它们是否符合输入的比例条件。
#include<iostream>
#include<cstdio>
#include<algorithm> // 引入算法库,这里主要使用 next_permutation 函数
using namespace std;
typedef long long LL;
int a[10]; // 定义一个全局数组,用于存储数字1到9,生成三位数的排列
int main() {
long long A, B, C, x, y, z, cnt = 0; // 声明变量A, B, C(输入比例)和x, y, z(三位数)以及cnt(满足条件的组合计数)
cin >> A >> B >> C; // 读取用户输入的比例值A, B, C
for (int i = 1; i <= 9; i++) { // 初始化数组a,赋值为1到9
a[i] = i;
}
do {
// 根据当前排列,组合出三个三位数x, y, z
x = a[1] * 100 + a[2] * 10 + a[3];
y = a[4] * 100 + a[5] * 10 + a[6];
z = a[7] * 100 + a[8] * 10 + a[9];
// 检查x, y, z是否满足给定的比例关系
if (x * B == y * A && y * C == z * B) {
printf("%lld %lld %lld\n", x, y, z); // 如果满足条件,则打印这三个数
cnt++; // 满足条件的组合计数加1
}
} while (next_permutation(a + 1, a + 10)); // 生成并遍历所有可能的排列,直到回到初始排列
if (!cnt) puts("No!!!"); // 如果没有找到任何满足条件的组合,打印"No!!!"
return 0; // 程序正常结束
}