题目描述
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
输入
没有输入。
输出
1个整数
思路
拿到本题,立马就应该想到这是一道排列组合的题目,只需要将0~9在积木的各个位置全排列,筛选出符合条件的摆法即可。小编呢,在这里分享一下我们老师讲的很好用的全排列模板。
全排列模板
下面是用此模板编写的程序,十分简单易懂。
#include <stdio.h>
#define N 10
int a[]={0,1,2,3,4,5,6,7,8,9};
int num=0;
void disp()
{
if( (a[0]<a[1]&&a[0]<a[2]) && (a[1]<a[3]&&a[1]<a[4]) && (a[2]<a[4]&&a[2]<a[5]) && (a[3]<a[6]&&a[3]<a[7]) && (a[4]<a[7]&&a[4]<a[8]) && (a[5]<a[8]&&a[5]<a[9]) )
num++;
}
void change(int *a,int i)
{
int t=a[0];
a[0]=a[i];
a[i]=t;
}
void permit(int *a,int n)
{
int i;
if(n==1)
{
disp();
return;
}
for(i=0;i<n;i++)
{
change(a,i);
permit(a+1,n-1);
change(a,i);
}
}
int main ()
{
permit(a,N);
printf ("%d",num);
return 0;
}
可见,disp(); 函数里面只有一个按照题目要求添加的条件。
答案:768
运行示例