Problem:排队

Problem:排队

Description
小Q是班长。在校运动会上,小Q班要进行队列表演。小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为1的同学中间恰好夹1名同学,两个编号为2的同学中间恰好夹2名同学,……,两个编号为N的同学中间恰好夹N名同学,小Q希望知道这样的排法能否实现。

Input
输入文件仅包括一行,即要处理的N。N<=13

Output
输出有多少种排列顺序.

Sample Input
3
Sample Output
2

这道题先读题,可以得到以3为例的数组:
312132(这只是一种)
求有几种解法。
看代码理解:

#include<bits/stdc++.h>//可爱的万能头
using namespace std;
int n,ans=0;//几个数,计数
bool used[30]={false};//打标,先全定false
void find(int dep)//搜索
{
	if(dep>n)//如果大于n就计数
	{
		ans++;
		return;
	}
	for(int i=1;i<=2*n-dep-1;i++)//由1为例可得(1的对应点为n+n+1-起点)搜索
	{
		if(!used[i]&&!used[i+dep+1])
		{
			used[i]=used[i+dep+1]=true;//打标
			find(dep+1);//搜索下一个数
			used[i]=used[i+dep+1]=false;//去标
		}
	}
}
int main()
{
	cin>>n;
	find(1);
	cout<<ans<<endl;//输出
	return 0; //完美的结束
}

这道题的关键在于如何去搜索对应点这是非常重要的,加上一点基础的代码能力就能解决(想多了),嗯大概就是这样。
大家都懂:

#include<bits/stdc++.h>
using namespace std;
int n,ans=0;
bool used[30]={false};
void find(int dep)
{
	if(dep>n)
	{
		ans++;
		return;
	}
	for(int i=1;i<=2*n-dep-1;i++)
	{
		if(!used[i]&&!used[i+dep+1])
		{
			used[i]=used[i+dep+1]=true;
			find(dep+1);
			used[i]=used[i+dep+1]=false;
		}
	}
}
int main()
{
	cin>>n;
	find(1);
	cout<<ans<<endl;
	return 0; 
}

喜欢樱花的留下一个评论关注吧!!
蟹蟹!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值