挑剔数列介绍:

挑剔数列问题是一个有趣的数学问题。

给定正整数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
View Code

相关文章:

  • 2021-08-10
  • 2022-01-25
  • 2022-12-23
  • 2022-01-19
  • 2021-04-07
  • 2021-07-12
  • 2021-10-14
  • 2021-08-01
猜你喜欢
  • 2022-01-17
  • 2021-07-09
  • 2022-02-02
  • 2021-05-29
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案