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); } }
