1. 程式人生 > >洛谷P1618 三連擊(升級版)

洛谷P1618 三連擊(升級版)

題目描述
將1,2,…,9共9個數分成三組,分別組成三個三位數,且使這三個三位數的比例是A:B:C,試求出所有滿足條件的三個三位數,若無解,輸出“No!!!”。

輸入格式:
三個數,A B C。

輸出格式:
若干行,每行3個數字。按照每行第一個數字升序排列。

輸入樣例#1:
1 2 3
輸出樣例#1:
192 384 576
219 438 657
273 546 819
327 654 981
說明
保證A<B<C

//t[1]至t[3]儲存第一個數字的百位、十位、個位數字
//t[4]至t[6]儲存第二個數字的百位、十位、個位數字
//t[7]至t[9]儲存第三個數字的百位、十位、個位數字
#include<iostream>
using namespace std;
int main()
{
	int i,j,l;
	int a,b,c,flag=1;
	int maxnum1=0,count=0;
	int num1,num2,num3,t[10]={0,0,0,0,0,0,0,0,0,0};
	cin>>a>>b>>c;
	maxnum1=(999*a)/c;
	for(i=1;i<=9;i++)
	{
		t[1]=i;
		for(j=1;j<=9;j++)
		{
			if(j==i) continue;
			t[2]=j;
			for(l=1;l<=9;l++)
			{
				flag=1;
				if(l==i||l==j) continue;
				t[3]=l;
				num1=i*100+j*10+l;
				if(num1>maxnum1) break;
				else
				{
					num2=num1*b/a;
					num3=num1*c/a;
					t[4]=num2/100;
					t[5]=(num2/10)%10;
					t[6]=num2%10;
					for(int k=4;k<=6;k++)
						{
						for(int m=1;m<=k-1;m++)
							if(t[k]==t[m]||t[k]==0) 
							{
							flag=0;	break;
							}
						if(flag==0) break;
						else //flag!=0
						{
							flag=1;
							t[7]=num3/100;
							t[8]=(num3/10)%10;
							t[9]=num3%10;
							for(int n=7;n<=9;n++)
							{
							   for(int o=1;o<=n-1;o++)
								{
									if(t[n]==0||t[n]==t[o])
									{
									flag=0;break;	
									}
								}	
							if(flag==0)
							break;
							}	
							
						}
						}
				if(flag)
				{
					count++;
					cout<<num1<<" "<<num2<<" "<<num3<<endl;
				}	
				
				}
					
			}
			
		}
	}
	if(count==0)
	{
		cout<<"No!!!"<<endl;
	}	
	return 0;
}