P1618 三连击(升级版)
题目描述
将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
思路:先打表,找出所有不含重复数字的三位数存在set容器里,方便用find()查找。然后遍历,输出满足比例的数字。
#include<iostream>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=1000;
int a,b,c;
int flag=0;//判断是否有结果
bool judge(int x,int y,int z)//筛选
{
if(x==y||y==z||x==z)
{
return true;
}
return false;
}
int qz(int x,int y,int z)
{
return x*100+y*10+z;
}
void jud(int x,int y,int z)
{
bool vis[10];
memset(vis,0,sizeof(vis));
int sum;
int a1=x,a2=y,a3=z;
while(x)
{
vis[x%10]=true;
x/=10;
}
int f=1;
while(y)
{
int s=y%10;
if(vis[s]==true)
{
f=0;
return;
}
vis[s]=true;
y/=10;
}
while(z)
{
int s=z%10;
if(vis[s]==true)
{
f=0;
return;
}
vis[s]=true;
z/=10;
}
if(f)
{
flag=1;
int p[3];
p[0]=a1;p[1]=a2;p[2]=a3;
sort(p,p+3);//从小到大输出
cout<<p[0]<<" "<<p[1]<<" "<<p[2]<<endl;
}
}
int main()
{
cin>>a>>b>>c;
int i,j,k;
set<int>q;
for(i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
for(k=1;k<10;k++)
{
if(judge(i,j,k))
{
continue;
}
q.insert(qz(i,j,k));//打表,找出没有重复数字的三位数
}
}
}
set<int>::iterator it=q.begin();
for(;it!=q.end();it++)
{
int x,y,z;
x=*it;
y=x/a*b;
z=x/a*c;
if(x*b!=y*a||(x*c!=z*a)||(y*c!=z*b))//因为是int型数,在做除法时会有误差
{
continue;
}
if(q.find(y)==q.end()||q.find(z)==q.end())//找出另外两个数是否含有重复数字1
{
continue;
}
if(x>=maxn||y>=maxn||z>=maxn)//三位数
{
continue;
}
jud(x,y,z);
}
if(!flag)
{
cout<<"No!!!"<<endl;
}
return 0;
}