挑剔数列介绍:
挑剔数列问题是一个有趣的数学问题。
给定正整数n,对1~n的这些整数,每个数字取两个,进行全排列,使得任意两个相同数字a[i]之间间隔a[i]个数字。求满足条件的排列以及排列数。
eg1: n = 3 可以列举出如下两个满足条件的排列:
2 3 1 2 1 3
3 1 2 1 3 2 他们其实互为逆序排列,本质上是一个组合方式。
eg2: n = 4
2 3 4 2 1 3 1 4
4 1 3 1 2 4 3 2
total:2
当n变大的时候,排列数变得很多,问题变得复杂化,怎么解决呢?
在排列问题中,我们采用递归的方式求所有的排列方式。
这个问题相当于带条件的排列问题。
排列问题中我们采用深度优先搜索(dfs)的方法,搜索可行解。
我们有两种做法:
1.求出2n个数的全排列,然后判断排列是否符合条件。
2.直接构造、搜索满足的排列。
相比之下,第一种复杂度比第二种高的多。
本文采用递归/深度优先搜索的方法,实现第二种方法。
数据结构及其定义:
integer: n,len(n的位数),sum 总的方案数,use,使用数字个数,m返回栈顶元素
array: p[2n] 用来存储排列结果
used[2n] 用来标记是否对应位置是否使用
stack: s 用来保存排列位置的信息
stack也可以用vector来实现。
算法:
dfs深度优先搜索 : permute(pos) 考虑索引为pos的位置填充方法。
结果展示:
n=7
7 1 4 1 5 6 7 4 2 3 5 2 6 3 7 1 4 1 6 7 3 4 5 2 3 6 2 7 5 1 5 1 4 6 7 3 5 4 2 3 6 2 7 1 5 1 6 3 7 4 5 3 2 6 4 2 7 1 5 1 6 7 2 4 5 2 3 6 4 7 3 1 5 1 7 3 4 6 5 3 2 4 7 2 6 1 6 1 3 5 7 4 3 6 2 5 4 2 7 1 6 1 7 2 4 5 2 6 3 4 7 5 3 1 7 1 2 5 6 2 3 4 7 5 3 6 4 1 7 1 2 6 4 2 5 3 7 4 6 3 5 2 3 6 2 7 3 4 5 1 6 1 4 7 5 2 3 7 2 6 3 5 1 4 1 7 6 5 4 2 4 7 2 3 6 4 5 3 1 7 1 6 5 2 5 6 2 3 7 4 5 3 6 1 4 1 7 2 6 3 2 5 7 3 4 6 1 5 1 4 7 2 6 3 2 7 4 3 5 6 1 4 1 7 5 2 6 7 2 1 5 1 4 6 3 7 5 4 3 2 7 4 2 3 5 6 4 3 7 1 5 1 6 3 4 5 7 3 6 4 1 5 1 2 7 6 2 3 4 6 7 3 2 4 5 2 6 1 7 1 5 3 5 7 2 3 6 2 5 4 1 7 1 6 4 3 5 7 4 3 6 2 5 4 2 7 1 6 1 3 6 7 1 3 1 4 5 6 2 7 4 2 5 3 7 4 6 3 2 5 4 2 7 6 1 5 1 4 1 6 1 7 4 3 5 2 6 3 2 7 5 4 1 7 1 6 4 2 5 3 2 7 6 3 5 4 5 6 7 1 4 1 5 3 6 2 7 3 2 4 6 1 7 1 4 3 5 6 2 3 7 2 5 4 6 1 7 1 4 5 2 6 3 2 7 5 3 4 6 3 5 7 4 3 2 6 5 2 1 7 1 5 1 7 1 6 2 5 4 2 3 7 6 4 3 5 2 4 6 2 7 5 4 3 1 6 1 3 7 5 2 4 7 2 6 5 4 1 3 1 7 6 3 5 2 6 4 2 7 5 3 4 6 1 3 1 7 5 2 7 3 2 6 5 3 4 1 7 1 6 4 5 3 6 4 7 3 5 2 4 6 2 1 7 1 5 3 6 7 2 3 5 2 4 6 1 7 1 4 5 6 1 7 1 3 5 4 6 3 2 7 4 2 5 7 1 4 1 6 5 3 4 7 2 3 6 2 5 7 2 3 6 2 5 3 4 7 1 6 1 4 5 7 2 6 3 2 5 4 3 7 6 1 4 1 5 7 4 1 6 1 5 4 3 7 2 6 3 2 6 1 5 1 7 3 4 6 5 3 2 4 7 2 6 2 7 4 2 3 5 6 4 3 7 1 5 1 7 1 3 1 6 4 3 5 7 2 4 6 2 5 7 1 4 1 6 3 5 4 7 3 2 6 5 2 7 2 4 5 2 6 3 4 7 5 3 1 6 1 7 2 4 6 2 3 5 4 7 3 6 1 5 1 7 2 6 3 2 4 5 3 7 6 4 1 5 1 7 3 1 6 1 3 4 5 7 2 6 4 2 5 7 3 6 2 5 3 2 4 7 6 5 1 4 1 7 4 1 5 1 6 4 3 7 5 2 3 6 2 total:52