[DFS]排队(间隔排列)-C++

这篇博客探讨了一道关于队列表演排列的问题,其中每个编号都有两位同学佩戴。班长小Q需要找到一种方式,使得相同编号的同学之间夹着相应数量的同学。通过DFS搜索算法来寻找解决方案,并针对大N值时的效率问题进行了剪枝优化。博客提供了样例输入和输出,以及问题的数学证明,指出当n%4不等于1或2时,无解。
摘要由CSDN通过智能技术生成

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

先理解一下题目,题目中所述,每一个从1到N的自然数都被某2名同学佩戴,说明共有2N名同学,两个编号为N的同学中间恰好夹N名同学,就可以得到一个排列(以n==3为例):

在这里插入图片描述
然后,就可以用DFS搜索了。

#include<bits/stdc++.h>
using namespace std;

int n,ans=0;
int flag[100]={0};

void dfs(int dep){
	
	if(dep>n){
		ans++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值