NOIP 1998 普及组 复赛 三连击

    xiaoxiao2021-03-25  119

    NOIP 1998 普及组 复赛 三连击

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

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

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

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

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

    #include <stdio.h> #include <string.h> 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 <stdio.h> 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;         x[2]=a/10;         x[3]=a/100;         x[4]=b;         x[5]=b/10;         x[6]=b/100;         x[7]=c;         x[8]=c/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);     } }

    转载请注明原文地址: https://ju.6miu.com/read-19010.html

    最新回复(0)