P1618 三连击(升级版)
原创
©著作权归作者所有:来自51CTO博客作者不想悲伤到天明的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目描述
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。
//感谢黄小U饮品完善题意
输入输出格式
输入格式:
三个数,A B C。
输出格式:
若干行,每行3个数字。按照每行第一个数字升序排列。
输入输出样例
输入样例#1: 复制
1 2 3
输出样例#1: 复制
192 384 576
219 438 657
273 546 819
327 654 981
说明
保证A<B<C
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <set>
#include <cstring>
#include <stack>
#include <vector>
#include <queue>
#define Swap(a,b) a ^= b ^= a ^= b
#define cl(a,b) memset(a,b,sizeof(a))
using namespace std ;
typedef long long LL;
const int N = 100000001 ;
LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
LL lcm(LL a,LL b){return a/gcd(a,b)*b;}
const int MAX = 20;
const int inf = 0xffffff;
const LL mod = 1e9+7 ;
// ----+-+------------------------
int vis[MAX];
int a[MAX] ;
int a1 ,b ,c ;
int cnt ;
void dfs(int v){
if(v == 10){
int p1 = a[1]*100+ a[2]*10 +a[3];
int p2 = a[4]*100+ a[5]*10 +a[6];
int p3 = a[7]*100+ a[8]*10 +a[9];
if( (p1*b == p2)&&(p1*c == p3) ||(p1 == a1 &&p2 ==b &&p3 ==c) )
{
cnt ++ ;
cout<<p1<<" "<<p2<<" "<<p3<<endl ;
}
// cout<<endl;
return ;
}
for(int i = 1 ; i<=9;i++){
if(!vis[i]){
vis[i] = 1 ;
a[i] = v;
dfs(v+1) ;
vis[i] = 0 ;
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
cin >>a1>>b >>c ;
dfs(1);
if(cnt==0){
cout<<"No!!!"<<endl;
}
return 0;
}