P1618 三连击(升级版)

https://www.luogu.com.cn/problem/P1618

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a, b, c;
 4 int dic[10];  //用于判断是否1-9每个数都出现过 
 5 bool check1(int n){    //检查各位数上是否有0 或 任意两位相等 
 6     int ge, shi, bai;
 7     ge=n%10;  shi=n/10%10;  bai=n/100;
 8     return ge!=shi && ge!=bai && shi!=bai && ge!=0 && shi!=0 && bai!=0;
 9 }
10 bool check2(int x, int y, int z){   //检查x, y, z各位数上是否有相同数字
11     memset(dic, 0, sizeof(dic));    //将数组dic初始化为0,假定都没有出现 
12     dic[x/100]=1; dic[x/10%10]=1; dic[x%10]=1;  //将出现的数字值赋值为1 
13     dic[y/100]=1; dic[y/10%10]=1; dic[y%10]=1;
14     dic[z/100]=1; dic[z/10%10]=1; dic[z%10]=1;
15     
16     for(int i=1; i<10; i++){  //通过循环来判断1-9是否没有出现 
17         if(dic[i]==0)return 0;
18     }
19     return 1;
20 }
21 int main()
22 {
23     bool f=1;//假定结果为“No!!!” 
24     cin>>a>>b>>c;
25     for(int x=100; x<1000; x++){
26         if(!check1(x))continue;   //检查x各位数上是否有0 或 任意两位相等  
27         int y=b*x/a;              //通过a:b=x:y计算y的结果 
28         if(!check1(y))continue;   //检查y各位数上是否有0 或 任意两位相等
29         int z=c*x/a;              //通过a:c=x:z计算z的结果
30         if(!check1(z))continue;   //检查z各位数上是否有0 或 任意两位相等
31         if(c*y!=b*z)continue;     //检查b:c==y:z;
32         if(check2(x, y, z)){      //检查x, y, z各位数上是否有相同数字,见check2函数 
33             cout<<x<<" "<<y<<" "<<z<<endl;
34             f=0;
35         }
36     }
37     if(f)  //特判答案为 "No!!!"的情况 
38         cout<<"No!!!";
39     return 0;
40 } 

切勿跟上一题一样,一位一位去暴力,或3位3位去暴力!尤其要注意根据题意排除没有必要的枚举!

原文地址:https://www.cnblogs.com/tflsnoi/p/13300141.html