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