蓝桥杯-搭积木问题
问题描述:
小明最近喜欢搭数字积木。一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
问题分析:
这道题目,其实我没有想到很好的思路,很多人说使用递归方法求解,可是我一直没想出来,因此我才用的是暴力破解,循环了10次,(代码十分丑陋,不忍直视....),直接上代码了。
代码描述:
1 #include<stdio.h> 2 int a[11]= {0}; 3 int b[11]= {0,1,2,3,4,5,6,7,8,9}; //每个b[i]分别存放0..9 4 int count=0;//计数器 5 int main() { 6 int d=0,c=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,p=0; 7 for(d=0; d<10; d++) { 8 a[0]=b[d]; 9 for(c=0; c<10; c++) { 10 a[1]=b[c]; 11 for(e=0; e<10; e++) { 12 a[2]=b[e]; 13 for(f=0; f<10; f++) { 14 a[3]=b[f]; 15 for(g=0; g<10; g++) { 16 a[4]=b[g]; 17 for(h=0; h<10; h++) { 18 a[5]=b[h]; 19 for(i=0; i<10; i++) { 20 a[6]=b[i]; 21 for(j=0; j<10; j++) { 22 a[7]=b[j]; 23 for(k=0; k<10; k++) { 24 a[8]=b[k]; 25 for(p=0; p<10; p++) { 26 a[9]=b[p]; 27 if(a[0]!=a[1]&&a[0]!=a[2]&&a[0]!=a[3]&&a[0]!=a[4]&&a[0]!=a[5]&&a[0]!=a[6]&&a[0]!=a[7]&&a[0]!=a[8]&&a[0]!=a[9]) 28 if(a[1]!=a[2]&&a[1]!=a[3]&&a[1]!=a[4]&&a[1]!=a[5]&&a[1]!=a[6]&&a[1]!=a[7]&&a[1]!=a[8]&&a[1]!=a[9]) 29 if(a[2]!=a[3]&&a[2]!=a[4]&&a[2]!=a[5]&&a[2]!=a[6]&&a[2]!=a[7]&&a[2]!=a[8]&&a[2]!=a[9]) 30 if(a[3]!=a[4]&&a[3]!=a[5]&&a[3]!=a[6]&&a[3]!=a[7]&&a[3]!=a[8]&&a[3]!=a[9]) 31 if(a[4]!=a[5]&&a[4]!=a[6]&&a[4]!=a[7]&&a[4]!=a[8]&&a[4]!=a[9]) 32 if(a[5]!=a[6]&&a[5]!=a[7]&&a[5]!=a[8]&&a[5]!=a[9]) 33 if(a[6]!=a[7]&&a[6]!=a[8]&&a[6]!=a[9]) 34 if(a[7]!=a[8]&&a[7]!=a[9]) 35 if(a[8]!=a[9]) { 36 if(a[0]<a[1]&&a[0]<a[2]) 37 if(a[1]<a[3]&&a[1]<a[4]) 38 if(a[2]<a[4]&&a[2]<a[5]) 39 if(a[3]<a[6]&&a[3]<a[7]) 40 if(a[4]<a[7]&&a[4]<a[8]) 41 if(a[5]<a[8]&&a[5]<a[9]) { 42 count++; 43 } 44 } 45 } 46 47 } 48 } 49 } 50 } 51 } 52 } 53 } 54 } 55 56 } 57 58 59 60 61 62 63 64 65 66 printf("%d",count); 67 return 0; 68 }
结果如下: