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++;
return ;
}
for(int i=1;i<=2*n-dep-1;i++){
if(!flag[i]&&!flag[i+dep+1]){//考虑当前位置有无其他数,和它的间隔有没有其他数
flag[i]=flag[i+dep+1]=1;
dfs(dep+1);
flag[i]=flag[i+dep+1]=0;
}
}
}
int main(){
cin >> n;
dfs(1);
cout << ans; return 0;
}

但是,可以发现,当程序运行12或13时,耗时很长,那么就可以想到剪枝优化。

	if(n%4==1||n%4==2){
return ;
}

现在,就可以证明一下这个剪枝的得到。

设问题的一个解为a1+a2···+an,a1表示1。

那么可以得到a1+a2+…+an+(a1+1+1)+(a2+2+1)+…+(an+n+1),最后解得4(a1+a2+…+an)=n(3n-1),所以n%41或n%42无解。

#include<bits/stdc++.h>
using namespace std; int n,ans=0;
int flag[100]={0}; void dfs(int dep){ if(n%4==1||n%4==2){
return ;
}
if(dep>n){
ans++;
return ;
}
for(int i=1;i<=2*n-dep-1;i++){
if(!flag[i]&&!flag[i+dep+1]){
flag[i]=flag[i+dep+1]=1;
dfs(dep+1);
flag[i]=flag[i+dep+1]=0;
}
}
}
int main(){
cin >> n;
dfs(1);
cout << ans; return 0;
}

[DFS]排队(间隔排列)-C++的更多相关文章

  1. 【题解】间隔排列-C++

    题目Description小Q是班长.在校运动会上,小Q班要进行队列表演.小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为 ...

  2. [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)

    Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...

  3. NOJ1103-全排列

    全排列 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 1148            测试通过 : 302  ...

  4. bzoj3991 lca+dfs序应用+set综合应用

    /* 给定一棵树,树上会出现宝物,也会有宝物消失 规定如果要收集树上所有宝物,就要选择一个点开始,到每个宝物点都跑一次,然后再回到那个点 现在给定m次修改,每次修改后树上就有一个宝物消失,或者一个宝物 ...

  5. SIGGRAPH 2014 之行

    当地时间8月8号: 经历十个多小时的飞行,在紧急出口旁的位置上忍受发动机的轰鸣声后,顺利降落温哥华机场.回答完加拿大边检的几个诸如为何而来,打算住哪儿的问题后,比较顺利出关.三十五加元的打车费及百分十 ...

  6. IOS开发基础知识--碎片50

      1:Masonry 2个或2个以上的控件等间隔排序 /** * 多个控件固定间隔的等间隔排列,变化的是控件的长度或者宽度值 * * @param axisType 轴线方向 * @param fi ...

  7. Masonry介绍与使用实践:快速上手Autolayout

    1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 w ...

  8. Storm入门3-集群搭建

    [storm集群的搭建以及将开发好的拓扑提交到集群上运行的方法] 在上一篇文章中,我们的拓扑直接运行,并在程序开始时候自动启动一个本地"集群"来运行拓扑.LocalCluster这 ...

  9. Coding源码学习第四部分(Masonry介绍与使用(三))

    接上篇继续进行Masonry 的学习. (12)tableViewCell 布局 #import "TableViewController.h" #import "Tes ...

随机推荐

  1. 29、Java虚拟机垃圾回收调优

    一.背景 如果在持久化RDD的时候,持久化了大量的数据,那么Java虚拟机的垃圾回收就可能成为一个性能瓶颈.因为Java虚拟机会定期进行垃圾回收,此时就会追踪所有的java对象, 并且在垃圾回收时,找 ...

  2. LeetCode算法题-链表类

    1.将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. (可以参照第2的merge2List实现) 示例: 输入:1->2->4, 1->3 ...

  3. Rancher2.3.2部署Kubenetes Dashboard

    首先进入到集群中的System命令空间,因为kubenetes dashboard是给整个集群使用的,并不是默认的Default命名空间使用的 Default命名空间,是默认的命名空间,也是在部署其他 ...

  4. TP-Link TL-WR941N Ver 5.1安装OPENWRT过程

    昨天为了试验下adsl多拨刷OPENWRT成砖了,硬件是WR941N Ver 5.1,用的是在原厂固件下的web界面直刷openwrt-ar71xx-tl-wr941nd-v4-squashfs-fa ...

  5. 【转】python requests库添加自定义cookie的方法

    requests库是个很方便的爬虫,相关文档已经很详细了.不过我今天在爬网页时,有一个网站是在脚本中添加cookie的,但我向requests.cookies里添加cookie费了不少周折.尝试了多个 ...

  6. Mysql| 组合where子句过滤数据(AND,OR,IN,NOT)

    ysql 允许使用多个where子句,组合where子句允许使用两种方式使用:AND 和OR子句的方式使用.数据库中的操作符号:AND , OR , IN , NOT. AND:SELECT * FR ...

  7. [转发]ASP.NET Core2集成Office Online Server(OWAS)实现办公文档的在线预览与编辑(支持word\excel\ppt\pdf等格式)

    转载自:https://www.cnblogs.com/Andre/p/9549874.html Office Online Server是微软开发的一套基于Office实现在线文档预览编辑的技术框架 ...

  8. EditText限制输入的几种方式及只显示中文汉字的做法

    最近项目要求限制密码输入的字符类型, 例如不能输入中文.   现在总结一下EditText的各种实现方式,  以比较各种方法的优劣. 第一种方式:  设置EditText的inputType属性,可以 ...

  9. fastjson字段顺序问题

    构造函数中指定使用有序 public JSONObject(boolean ordered) { this(16, ordered);} 示例: JSONObject fastJson = new J ...

  10. leetcode 11. Container With Most Water 、42. Trapping Rain Water 、238. Product of Array Except Self 、407. Trapping Rain Water II

    11. Container With Most Water https://www.cnblogs.com/grandyang/p/4455109.html 用双指针向中间滑动,较小的高度就作为当前情 ...