蓝桥杯 ——积木问题——C++

问题描述:

小明最近喜欢搭数字积木。一共有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;
 } 

 运行结果:

 

posted @ 2018-03-31 13:08  Howbin  阅读(570)  评论(0编辑  收藏  举报