问题描述:
小明最近喜欢搭数字积木。一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种
解题思路:
利用函数产生全排列,然后逐一排除;
源代码:
#include<iostream> #include<cstring> using namespace std; string X="0123456789";//数据结构 int N=0;//全局变量 记录方案数 bool Test(); void Show(); void Permutation(int k)//以字符串为数据结构产生全排列 { if(k==X.length()-1) { if(Test()) { Show(); N++; } return ; } for(int i=k; i<X.length(); i++) { char temp; temp=X[k]; X[k]=X[i]; X[i]=temp; Permutation(k+1); X[i]=X[k]; X[k]=temp; } } bool Test() //检验排列是否合法 { if(X[0]>X[1]) return 0; if(X[0]>X[2]) return 0; if(X[1]>X[3]) return 0; if(X[1]>X[4]) return 0; if(X[2]>X[4]) return 0; if(X[2]>X[5]) return 0; if(X[3]>X[6]) return 0; if(X[3]>X[7]) return 0; if(X[4]>X[7]) return 0; if(X[4]>X[8]) return 0; if(X[5]>X[8]) return 0; if(X[5]>X[9]) return 0; return 1; } void Show() //塔型输出 { cout<<X[0]<<endl; cout<<X[1]<<" "<<X[2]<<endl; cout<<X[3]<<" "<<X[4]<<" "<<X[5]<<endl; cout<<X[6]<<" "<<X[7]<<" "<<X[8]<<" "<<X[9]<<endl; } int main() { Permutation(0); cout<<N<<endl; return 0; }
运行结果: