题目描述
将 1,2,…,9 共 9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!
。
//感谢黄小U饮品完善题意
输入格式
三个数,A,B,C。
输出格式
若干行,每行 3 个数字。按照每行第一个数字升序排列。
输入输出样例
输入
1 2 3
输出
192 384 576
219 438 657
273 546 819
327 654 981
说明/提示
保证 0≤A<B<C≤999。
代码
无注释版
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int p[10],q[10];
int ans;
void dfs(int n){
if(n==10){
int x=0,y=0,z=0;
for(int i=1;i<=9;i++){
if(i<=3){
x=x*10+p[i];
}
else if(i<=6){
y=y*10+p[i];
}
else z=z*10+p[i];
}
if(x*c==z*a&&y*c==z*b){
cout<<x<<" "<<y<<" "<<z<<"\n";
ans++;
}
return;
}
for(int i=1;i<=9;i++){
if(q[i]==0){
p[n]=i;
q[i]=1;
dfs(n+1);
q[i]=0;
}
}
}
int main(){
cin>>a>>b>>c;
dfs(1);
if(ans==0) cout<<"No!!!";
}
有注释版
#include<bits/stdc++.h> // 包含标准库的所有头文件
using namespace std; // 使用标准命名空间
int a, b, c; // 三个比例数A, B, C
int p[10], q[10]; // p数组存储当前的排列,q数组标记数字是否被使用
int ans; // 记录满足条件的解的个数
// 深度优先搜索函数,用于生成1-9的所有排列
void dfs(int n) {
if (n == 10) { // 当排列完成(1-9都已使用)
int x = 0, y = 0, z = 0; // 初始化三个三位数x, y, z
for (int i = 1; i <= 9; i++) {
if (i <= 3) {
x = x * 10 + p[i]; // 前三个数字组成x
}
else if (i <= 6) {
y = y * 10 + p[i]; // 中间三个数字组成y
}
else {
z = z * 10 + p[i]; // 最后三个数字组成z
}
}
// 检查比例关系:x:y:z = A:B:C
if (x * c == z * a && y * c == z * b) {
cout << x << " " << y << " " << z << "\n"; // 输出解
ans++; // 解的个数增加
}
return; // 返回上一层递归
}
// 尝试将未使用的数字放入当前排列位置
for (int i = 1; i <= 9; i++) {
if (q[i] == 0) { // 如果数字i未被使用
p[n] = i; // 将i放入当前排列位置
q[i] = 1; // 标记i为已使用
dfs(n + 1); // 递归处理下一个位置
q[i] = 0; // 回溯,标记i为未使用
}
}
}
int main() {
cin >> a >> b >> c; // 输入比例数A, B, C
dfs(1); // 从第一个位置开始生成排列
if (ans == 0) { // 如果没有找到解
cout << "No!!!"; // 输出无解提示
}
return 0; // 程序正常结束
}