[DFS]排队(间隔排列)-C++
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++的更多相关文章
- 【题解】间隔排列-C++
题目Description小Q是班长.在校运动会上,小Q班要进行队列表演.小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为 ...
- [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)
Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...
- NOJ1103-全排列
全排列 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 1148 测试通过 : 302 ...
- bzoj3991 lca+dfs序应用+set综合应用
/* 给定一棵树,树上会出现宝物,也会有宝物消失 规定如果要收集树上所有宝物,就要选择一个点开始,到每个宝物点都跑一次,然后再回到那个点 现在给定m次修改,每次修改后树上就有一个宝物消失,或者一个宝物 ...
- SIGGRAPH 2014 之行
当地时间8月8号: 经历十个多小时的飞行,在紧急出口旁的位置上忍受发动机的轰鸣声后,顺利降落温哥华机场.回答完加拿大边检的几个诸如为何而来,打算住哪儿的问题后,比较顺利出关.三十五加元的打车费及百分十 ...
- IOS开发基础知识--碎片50
1:Masonry 2个或2个以上的控件等间隔排序 /** * 多个控件固定间隔的等间隔排列,变化的是控件的长度或者宽度值 * * @param axisType 轴线方向 * @param fi ...
- Masonry介绍与使用实践:快速上手Autolayout
1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 w ...
- Storm入门3-集群搭建
[storm集群的搭建以及将开发好的拓扑提交到集群上运行的方法] 在上一篇文章中,我们的拓扑直接运行,并在程序开始时候自动启动一个本地"集群"来运行拓扑.LocalCluster这 ...
- Coding源码学习第四部分(Masonry介绍与使用(三))
接上篇继续进行Masonry 的学习. (12)tableViewCell 布局 #import "TableViewController.h" #import "Tes ...
随机推荐
- 29、Java虚拟机垃圾回收调优
一.背景 如果在持久化RDD的时候,持久化了大量的数据,那么Java虚拟机的垃圾回收就可能成为一个性能瓶颈.因为Java虚拟机会定期进行垃圾回收,此时就会追踪所有的java对象, 并且在垃圾回收时,找 ...
- LeetCode算法题-链表类
1.将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. (可以参照第2的merge2List实现) 示例: 输入:1->2->4, 1->3 ...
- Rancher2.3.2部署Kubenetes Dashboard
首先进入到集群中的System命令空间,因为kubenetes dashboard是给整个集群使用的,并不是默认的Default命名空间使用的 Default命名空间,是默认的命名空间,也是在部署其他 ...
- TP-Link TL-WR941N Ver 5.1安装OPENWRT过程
昨天为了试验下adsl多拨刷OPENWRT成砖了,硬件是WR941N Ver 5.1,用的是在原厂固件下的web界面直刷openwrt-ar71xx-tl-wr941nd-v4-squashfs-fa ...
- 【转】python requests库添加自定义cookie的方法
requests库是个很方便的爬虫,相关文档已经很详细了.不过我今天在爬网页时,有一个网站是在脚本中添加cookie的,但我向requests.cookies里添加cookie费了不少周折.尝试了多个 ...
- Mysql| 组合where子句过滤数据(AND,OR,IN,NOT)
ysql 允许使用多个where子句,组合where子句允许使用两种方式使用:AND 和OR子句的方式使用.数据库中的操作符号:AND , OR , IN , NOT. AND:SELECT * FR ...
- [转发]ASP.NET Core2集成Office Online Server(OWAS)实现办公文档的在线预览与编辑(支持word\excel\ppt\pdf等格式)
转载自:https://www.cnblogs.com/Andre/p/9549874.html Office Online Server是微软开发的一套基于Office实现在线文档预览编辑的技术框架 ...
- EditText限制输入的几种方式及只显示中文汉字的做法
最近项目要求限制密码输入的字符类型, 例如不能输入中文. 现在总结一下EditText的各种实现方式, 以比较各种方法的优劣. 第一种方式: 设置EditText的inputType属性,可以 ...
- fastjson字段顺序问题
构造函数中指定使用有序 public JSONObject(boolean ordered) { this(16, ordered);} 示例: JSONObject fastJson = new J ...
- 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 用双指针向中间滑动,较小的高度就作为当前情 ...