洛谷P1008 三连击

来源:互联网 发布:网络贷款案例 编辑:程序博客网 时间:2024/04/29 02:06

题目背景:
本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述:
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数。

输入格式:
无输入

输出格式:
若干行,每行3个数字。按照每行第一个数字升序排列。

【暴力枚举】

#include<cstdio>int main(){    for(int i=1;i<=9;i++)      for(int j=1;j<=9;j++)        for(int k=1;k<=9;k++)          for(int a=1;a<=9;a++)            for(int b=1;b<=9;b++)               for(int c=1;c<=9;c++)                 for(int d=1;d<=9;d++)                   for(int e=1;e<=9;e++)                     for(int f=1;f<=9;f++)                    {                        if(i+j+k+a+b+c+d+e+f==45&&i!=j&&j!=k&&k!=a&&a!=b&&b!=c&&c!=d&&d!=e&&e!=f)                         if(i!=k&&i!=a&&i!=b&&i!=c&&i!=d&&i!=e&&i!=f)                          if(j!=a&&j!=b&&j!=c&&j!=d&&j!=e&&j!=f)                           if(k!=b&&k!=c&&k!=d&&k!=e&&k!=f)                            if(a!=c&&a!=d&&a!=e&&a!=f)                             if(b!=d&&b!=e&&b!=f)                              if(c!=e&&c!=f)                               if(d!=f)                                if(2*(i*100+j*10+k)==(a*100+b*10+c)&&3*(a*100+b*10+c)==2*(d*100+e*10+f))                                 printf("%d %d %d\n",(i*100+j*10+k),(a*100+b*10+c),d*100+e*10+f);                    }  }

【简化枚举】

#include<cstdio>int a,b,c,d,e,f,g,h,i,j,k,l,p;int main(){    for(int j=123;j<333;j++)    {        a=j/100;        b=j%100/10;        c=j%10;    if(a!=b&&b!=c&&c!=d)    {        d=j*2/100;        e=j*2%100/10;        f=j*2%10;        g=j*3/100;        h=j*3%100/10;        i=j*3%10;  if(a+b+c+d+e+f+g+h+i==45)      if(d!=b&&d!=c)        if(e!=a&&e!=c)         if(f!=a&&f!=b)           if(g!=b&&g!=c)             if(h!=a&&h!=c)               if(i!=a&&i!=b)                if(g!=e&&g!=f)                  if(h!=d&&h!=f)                    if(i!=d&&i!=f) printf("%d %d %d\n",j,j*2,j*3);    }        }    return 0;}

【STL库函数 全排列函数枚举】

#include <iostream>#include <algorithm>#include <cstdio>using namespace std;int f[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };bool Check(){    int a, b, c;    a = f[1] * 100 + f[2] * 10 + f[3];    b = f[4] * 100 + f[5] * 10 + f[6];    c = f[7] * 100 + f[8] * 10 + f[9];    if ( a * 2 == b && a * 3 == c ) return true;    else return false;}int main(){    while ( next_permutation ( f+1, f+10 ) ){        if ( Check() )        printf ( "%d%d%d %d%d%d %d%d%d\n", f[1], f[2], f[3], f[4], f[5], f[6], f[7], f[8], f[9] );    }    return 0;}

【枚举+判重】

#include<iostream>#include<algorithm>using namespace std;int i,j,a[15];bool ans;int main(){    for (i=123;i<=329;i++)    {        a[1]=i%10;        a[2]=i%100/10;        a[3]=i/100;        a[4]=2*i%10;        a[5]=2*i%100/10;        a[6]=2*i/100;        a[7]=3*i%10;        a[8]=3*i%100/10;        a[9]=3*i/100;        sort(a+1,a+10);        ans=true;        for (j=1;j<=9;j++) if (a[j]!=j) ans=false;        if (ans) cout<<i<<" "<<i*2<<" "<<i*3<<endl;    }    return 0;}
原创粉丝点击