C++12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

#include <iostream>
#define DefaultSize 9
//问题描述:
//12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
using namespace std;
class Grial
{
	public:
	Grial(int sz=DefaultSize)
	{
		visted = new bool [sz];
		data = new int [sz];
		size = sz;
		for(int i=1;i<=sz;i++)
		{
			visted[i]=0;	
		}
	}
	bool check(int a[])
	{
		if(
				(a[1]<a[2]&&a[2]<a[3]&&a[3]<a[4]&&a[4]<a[5]&&a[5]<a[6]&&
				 a[1]>a[7]&&a[2]>a[8]&&a[3]>a[9]&&a[4]>a[10]&&a[5]>a[11]&&a[6]>a[12]&&
				 a[7]<a[8]&&a[8]<a[9]&&a[9]<a[10]&&a[10]<a[11]&&a[11]<a[12]	
			  )
			)
				return true;
		return false;
	}
	void Insert(int start)
	{
		if(start==size+1)
			{
				int k = 0;
				if(check(data))
					{	
						for(int i=1;i<=size;i++)
						{
							cout<<data[i]<<"    ";
							k++;
							if(k%6==0)cout<<endl;	
						}
					cout<<"\033[35m-------------------------------------------------\033[0m"<<endl;
					}
					return ;
			}
			else
			{
				for(int i=1;i<=size;i++)
				{
					if(visted[i]==0)
						{	
							data[start]=i;
							visted[i]=1;
							Insert(start+1);
							visted[i]=0;
						}
				}
			}
	}
	private:
	int size;
	bool *visted;
	int *data;
};
int main()
{
	Grial g(12);
	g.Insert(1);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值