NOIP 1998 普及组 复赛 三连击

NOIP 1998 普及组 复赛 三连击

1.看到该题,想法很多,深度优先遍历。

2.但想想,该题应没这么复杂,先编编看。

3.编着编着还是深度优先算法,提交AC,将该题编难了。

4.换一个算法,该题应会简单许多。

附上AC代码,编译环境Dev-C++4.9.9.2

#include
#include
int a[10];
int visited[10];
int n=9;
void dfs(int step){
    int b,c,d;
    int i;
    b=a[1]*100+a[2]*10+a[3];
    c=a[4]*100+a[5]*10+a[6];
    d=a[7]*100+a[8]*10+a[9];
    if(step==n+1){
        if(c==2*b&&d==3*b)
            printf("%d %d %d\n",b,c,d);
        return;
    }
    for(i=1;i<=9;i++)
        if(visited[i]==0){
            a[step]=i;
            visited[i]=1;
            dfs(step+1);
            visited[i]=0;
        }
}
int main(){
    memset(visited,0,sizeof(visited));
    dfs(1);
    return 0;
}


//洛谷p1008 三连击
//难度:入门难度
//考点:输入,输出 ,整数四则运算,取整,取模  
//适用:小学生
//小技巧:分离出每个数的个十百位,其中 1*2*3*4*5*6*7*8*9=362880 1+2+3+4+5+6+7+8+9=45能判定数字是否重复
//方法:枚举
#include
int main(){
    int a,b,c;
    int x[10];
    int m,n,i;
    for(a=123;a<=333;a++){
        b=a*2;
        c=a*3;
        x[1]=a%10;
        x[2]=a/10%10;
        x[3]=a/100;
        x[4]=b%10;
        x[5]=b/10%10;
        x[6]=b/100;
        x[7]=c%10;
        x[8]=c/10%10;
        x[9]=c/100;
        m=1;
        n=0;
        for(i=1;i<=9;i++)
            m*=x[i];
        for(i=1;i<=9;i++)
            n+=x[i];
        if(m==362880&&n==45)//1*2*3*4*5*6*7*8*9 1+2+3+4+5+6+7+8+9//笔误,写成3628880查了会
            printf("%d %d %d\n",a,b,c);
    }
}


你可能感兴趣的:(NOIP,普及组,复赛)