zoukankan      html  css  js  c++  java
  • 一道有趣的数学题——挑剔数列的递归解法(C/C++实现)

    挑剔数列介绍:

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

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

    n=8

    8
    1 3 1 6 7 3 8 5 2 4 6 2 7 5 4 8
    1 3 1 6 8 3 4 7 5 2 6 4 2 8 5 7
    1 3 1 6 8 3 5 7 2 4 6 2 5 8 4 7
    1 3 1 6 8 3 7 4 2 5 6 2 4 8 7 5
    1 3 1 7 5 3 8 6 4 2 5 7 2 4 6 8
    1 3 1 7 8 3 5 2 6 4 2 7 5 8 4 6
    1 3 1 8 5 3 6 7 2 4 5 2 8 6 4 7
    1 3 1 8 6 3 7 2 4 5 2 6 8 4 7 5
    1 4 1 5 6 8 4 7 3 5 2 6 3 2 8 7
    1 4 1 5 7 8 4 3 6 5 2 3 7 2 8 6
    1 4 1 5 8 6 4 7 2 5 3 2 6 8 3 7
    1 4 1 8 6 3 4 7 5 3 2 6 8 2 5 7
    1 5 1 4 6 7 8 5 4 2 3 6 2 7 3 8
    1 5 1 6 4 7 8 5 3 4 6 2 3 7 2 8
    1 5 1 6 7 3 8 5 4 3 6 2 7 4 2 8
    1 5 1 6 7 8 2 5 4 2 6 3 7 4 8 3
    1 5 1 7 3 6 8 5 3 4 2 7 6 2 4 8
    1 5 1 7 3 8 6 5 3 2 4 7 2 6 8 4
    1 5 1 8 4 7 3 5 6 4 3 2 8 7 2 6
    1 5 1 8 6 2 7 5 2 3 4 6 8 3 7 4
    1 6 1 3 7 5 8 3 6 4 2 5 7 2 4 8
    1 6 1 3 7 8 4 3 6 5 2 4 7 2 8 5
    1 6 1 3 8 5 7 3 6 2 4 5 2 8 7 4
    1 6 1 5 8 4 7 3 6 5 4 3 2 8 7 2
    1 6 1 7 2 8 5 2 6 3 4 7 5 3 8 4
    1 6 1 7 4 8 3 5 6 4 3 7 2 5 8 2
    1 6 1 8 2 5 7 2 6 3 4 5 8 3 7 4
    1 6 1 8 2 7 4 2 6 5 3 4 8 7 3 5
    1 7 1 2 6 8 2 5 3 7 4 6 3 5 8 4
    1 7 1 2 8 5 2 4 6 7 3 5 4 8 3 6
    1 7 1 2 8 5 2 6 3 7 4 5 3 8 6 4
    1 7 1 2 8 6 2 3 5 7 4 3 6 8 5 4
    1 7 1 3 5 6 8 3 4 7 5 2 6 4 2 8
    1 7 1 3 8 4 5 3 6 7 4 2 5 8 2 6
    1 7 1 4 5 8 6 3 4 7 5 3 2 6 8 2
    1 7 1 4 6 8 3 5 4 7 3 6 2 5 8 2
    1 7 1 4 8 5 3 6 4 7 3 5 2 8 6 2
    1 7 1 6 2 8 5 2 4 7 6 3 5 4 8 3
    1 7 1 6 3 8 4 5 3 7 6 4 2 5 8 2
    1 7 1 8 2 4 6 2 5 7 4 3 8 6 5 3
    1 8 1 3 4 7 5 3 6 4 8 2 5 7 2 6
    1 8 1 4 6 3 7 5 4 3 8 6 2 5 7 2
    1 8 1 5 2 6 7 2 4 5 8 3 6 4 7 3
    1 8 1 5 3 7 4 6 3 5 8 4 2 7 6 2
    2 3 6 2 8 3 4 7 5 6 1 4 1 8 5 7
    2 3 8 2 4 3 6 7 5 4 1 8 1 6 5 7
    2 3 8 2 4 3 7 5 6 4 1 8 1 5 7 6
    2 3 8 2 7 3 6 1 5 1 4 8 7 6 5 4
    2 4 5 2 6 8 4 7 5 3 1 6 1 3 8 7
    2 4 5 2 8 6 4 7 5 1 3 1 6 8 3 7
    2 4 6 2 5 8 4 7 3 6 5 1 3 1 8 7
    2 4 6 2 7 8 4 5 1 6 1 3 7 5 8 3
    2 4 7 2 8 6 4 1 5 1 7 3 6 8 5 3
    2 4 8 2 3 7 4 6 3 5 1 8 1 7 6 5
    2 5 7 2 3 6 8 5 3 4 7 1 6 1 4 8
    2 5 7 2 6 3 8 5 4 3 7 6 1 4 1 8
    2 5 7 2 8 3 4 5 6 3 7 4 1 8 1 6
    2 5 7 2 8 6 1 5 1 4 7 3 6 8 4 3
    2 5 8 2 4 7 3 5 6 4 3 8 1 7 1 6
    2 6 3 2 7 8 3 5 6 1 4 1 7 5 8 4
    2 6 3 2 8 5 3 7 6 4 1 5 1 8 4 7
    2 6 4 2 7 8 3 4 6 5 3 1 7 1 8 5
    2 6 7 2 4 8 5 3 6 4 7 3 5 1 8 1
    2 6 7 2 8 1 5 1 6 4 7 3 5 8 4 3
    2 6 8 2 1 7 1 4 6 5 3 8 4 7 3 5
    2 6 8 2 5 3 7 4 6 3 5 8 4 1 7 1
    2 7 3 2 5 8 3 4 6 7 5 1 4 1 8 6
    2 7 4 2 8 5 3 4 6 7 3 5 1 8 1 6
    2 7 5 2 6 8 3 4 5 7 3 6 4 1 8 1
    2 7 8 2 3 4 5 6 3 7 4 8 5 1 6 1
    2 8 1 2 1 5 6 7 3 4 8 5 3 6 4 7
    2 8 1 2 1 5 7 4 6 3 8 5 4 3 7 6
    2 8 1 2 1 6 4 7 5 3 8 4 6 3 5 7
    2 8 1 2 1 6 7 3 4 5 8 3 6 4 7 5
    2 8 1 2 1 7 4 6 3 5 8 4 3 7 6 5
    2 8 1 2 1 7 5 3 6 4 8 3 5 7 4 6
    2 8 3 2 4 6 3 7 5 4 8 1 6 1 5 7
    2 8 4 2 3 6 7 4 3 5 8 1 6 1 7 5
    2 8 5 2 4 6 7 3 5 4 8 3 6 1 7 1
    2 8 5 2 6 3 7 4 5 3 8 6 4 1 7 1
    2 8 5 2 7 1 6 1 5 4 8 3 7 6 4 3
    2 8 5 2 7 3 4 6 5 3 8 4 7 1 6 1
    2 8 6 2 1 7 1 4 5 6 8 3 4 7 5 3
    2 8 6 2 3 5 7 4 3 6 8 5 4 1 7 1
    3 1 7 1 3 5 8 6 4 2 7 5 2 4 6 8
    3 1 7 1 3 6 8 5 2 4 7 2 6 5 4 8
    3 1 7 1 3 8 4 5 6 2 7 4 2 5 8 6
    3 1 7 1 3 8 6 4 2 5 7 2 4 6 8 5
    3 1 8 1 3 4 6 7 5 2 4 8 2 6 5 7
    3 1 8 1 3 4 7 5 6 2 4 8 2 5 7 6
    3 1 8 1 3 6 7 2 4 5 2 8 6 4 7 5
    3 1 8 1 3 7 5 2 6 4 2 8 5 7 4 6
    3 4 5 6 3 8 4 7 5 2 6 1 2 1 8 7
    3 4 6 7 3 8 4 5 1 6 1 7 2 5 8 2
    3 4 7 8 3 2 4 6 2 5 7 1 8 1 6 5
    3 4 8 5 3 7 4 2 6 5 2 8 1 7 1 6
    3 4 8 5 3 7 4 6 1 5 1 8 2 7 6 2
    3 4 8 6 3 7 4 1 5 1 6 8 2 7 5 2
    3 5 6 4 3 7 8 5 4 6 1 2 1 7 2 8
    3 5 6 8 3 2 7 5 2 6 4 1 8 1 7 4
    3 5 6 8 3 4 7 5 2 6 4 2 8 1 7 1
    3 5 6 8 3 7 1 5 1 6 4 2 8 7 2 4
    3 5 7 4 3 8 6 5 4 1 7 1 2 6 8 2
    3 5 8 2 3 7 2 5 6 4 1 8 1 7 4 6
    3 5 8 6 3 7 1 5 1 4 6 8 2 7 4 2
    3 6 2 7 3 2 8 5 6 4 1 7 1 5 4 8
    3 6 2 8 3 2 7 5 6 1 4 1 8 5 7 4
    3 6 4 5 3 7 8 4 6 5 1 2 1 7 2 8
    3 6 7 2 3 8 2 4 6 5 7 1 4 1 8 5
    3 6 8 1 3 1 5 7 6 4 2 8 5 2 4 7
    3 6 8 1 3 1 7 4 6 5 2 8 4 2 7 5
    3 6 8 1 3 1 7 5 6 2 4 8 2 5 7 4
    3 7 2 6 3 2 8 4 5 7 6 1 4 1 5 8
    3 7 4 6 3 8 5 4 2 7 6 2 5 1 8 1
    3 7 5 8 3 1 6 1 5 7 4 2 8 6 2 4
    3 7 8 2 3 4 2 5 6 7 4 8 1 5 1 6
    3 8 2 5 3 2 7 4 6 5 8 1 4 1 7 6
    3 8 4 5 3 6 7 4 2 5 8 2 6 1 7 1
    3 8 4 7 3 2 6 4 2 5 8 7 1 6 1 5
    3 8 4 7 3 6 2 4 5 2 8 7 6 1 5 1
    3 8 5 2 3 6 2 7 5 4 8 1 6 1 4 7
    3 8 5 7 3 1 6 1 5 4 8 7 2 6 4 2
    3 8 6 1 3 1 5 7 4 6 8 2 5 4 2 7
    3 8 6 2 3 5 2 7 4 6 8 5 1 4 1 7
    4 1 6 1 7 4 8 3 5 6 2 3 7 2 5 8
    4 1 6 1 7 4 8 5 2 6 3 2 7 5 3 8
    4 1 6 1 8 4 5 7 2 6 3 2 5 8 3 7
    4 1 8 1 7 4 2 5 6 2 3 8 7 5 3 6
    4 2 5 7 2 4 8 6 5 3 1 7 1 3 6 8
    4 2 5 8 2 4 6 7 5 1 3 1 8 6 3 7
    4 2 6 8 2 4 3 7 5 6 3 1 8 1 5 7
    4 2 6 8 2 4 7 5 1 6 1 3 8 5 7 3
    4 2 7 5 2 4 8 6 3 5 7 1 3 1 6 8
    4 2 7 8 2 4 6 1 5 1 7 3 8 6 5 3
    4 5 6 7 3 4 8 5 3 6 2 7 1 2 1 8
    4 5 6 7 8 4 1 5 1 6 3 7 2 8 3 2
    4 5 7 8 1 4 1 5 6 3 7 2 8 3 2 6
    4 5 8 6 3 4 7 5 3 2 6 8 2 1 7 1
    4 6 1 7 1 4 8 5 6 2 3 7 2 5 3 8
    4 6 1 8 1 4 7 3 6 5 2 3 8 2 7 5
    4 6 3 5 8 4 3 7 6 5 1 2 1 8 2 7
    4 6 3 7 8 4 3 2 6 5 2 7 1 8 1 5
    4 6 7 2 8 4 2 3 6 5 7 3 1 8 1 5
    4 6 8 2 5 4 2 7 6 3 5 8 1 3 1 7
    4 6 8 3 5 4 7 3 6 2 5 8 2 1 7 1
    4 7 1 6 1 4 8 5 3 7 6 2 3 5 2 8
    4 7 1 8 1 4 3 5 6 7 3 2 8 5 2 6
    4 7 1 8 1 4 6 2 5 7 2 3 8 6 5 3
    4 7 3 8 5 4 3 6 2 7 5 2 8 1 6 1
    4 7 3 8 6 4 3 2 5 7 2 6 8 1 5 1
    4 7 5 2 8 4 2 6 5 7 1 3 1 8 6 3
    4 7 5 3 6 4 8 3 5 7 2 6 1 2 1 8
    4 7 5 8 1 4 1 6 5 7 2 3 8 2 6 3
    4 7 8 2 5 4 2 6 3 7 5 8 3 1 6 1
    4 8 1 5 1 4 6 7 3 5 8 2 3 6 2 7
    4 8 3 5 7 4 3 6 2 5 8 2 7 1 6 1
    4 8 5 2 6 4 2 7 5 3 8 6 1 3 1 7
    4 8 5 3 6 4 7 3 5 2 8 6 2 1 7 1
    4 8 5 7 1 4 1 6 5 3 8 7 2 3 6 2
    4 8 6 2 7 4 2 3 5 6 8 3 7 1 5 1
    5 1 6 1 7 8 5 2 4 6 2 3 7 4 8 3
    5 1 6 1 8 4 5 7 3 6 4 2 3 8 2 7
    5 1 7 1 8 3 5 4 6 3 7 2 4 8 2 6
    5 1 8 1 3 6 5 7 3 4 2 8 6 2 4 7
    5 1 8 1 3 7 5 6 3 2 4 8 2 7 6 4
    5 1 8 1 7 2 5 6 2 3 4 8 7 3 6 4
    5 2 4 7 2 8 5 4 6 3 1 7 1 3 8 6
    5 2 4 8 2 7 5 4 6 1 3 1 8 7 3 6
    5 2 8 3 2 7 5 3 6 4 1 8 1 7 4 6
    5 2 8 6 2 3 5 7 4 3 6 8 1 4 1 7
    5 3 6 4 8 3 5 7 4 6 1 2 1 8 2 7
    5 3 7 4 8 3 5 6 4 1 7 1 2 8 6 2
    5 3 7 8 2 3 5 2 6 4 7 1 8 1 4 6
    5 3 7 8 4 3 5 6 2 4 7 2 8 1 6 1
    5 6 1 8 1 4 5 7 6 3 4 2 8 3 2 7
    5 6 1 8 1 7 5 2 6 4 2 3 8 7 4 3
    5 6 2 8 4 2 5 7 6 4 3 1 8 1 3 7
    5 6 7 1 8 1 5 3 6 4 7 3 2 8 4 2
    5 6 7 3 4 8 5 3 6 4 7 1 2 1 8 2
    5 7 1 6 1 8 5 3 4 7 6 3 2 4 8 2
    5 7 2 4 8 2 5 6 4 7 1 3 1 8 6 3
    5 7 2 8 3 2 5 6 3 7 4 1 8 1 6 4
    5 7 4 6 3 8 5 4 3 7 6 1 2 1 8 2
    5 7 4 6 8 2 5 4 2 7 6 3 1 8 1 3
    5 7 4 8 6 2 5 4 2 7 3 6 8 1 3 1
    5 7 8 4 2 6 5 2 4 7 3 8 6 1 3 1
    5 8 1 4 1 6 5 7 4 3 8 2 6 3 2 7
    5 8 1 4 1 7 5 6 4 2 8 3 2 7 6 3
    5 8 1 7 1 3 5 6 4 3 8 7 2 4 6 2
    5 8 2 3 7 2 5 3 6 4 8 1 7 1 4 6
    5 8 2 4 6 2 5 7 4 3 8 6 1 3 1 7
    5 8 2 7 4 2 5 6 3 4 8 7 3 1 6 1
    5 8 4 1 7 1 5 4 6 3 8 2 7 3 2 6
    5 8 6 4 2 7 5 2 4 6 8 3 1 7 1 3
    6 1 5 1 7 4 8 6 5 3 4 2 7 3 2 8
    6 1 5 1 8 4 7 6 5 2 4 3 2 8 7 3
    6 1 7 1 8 2 5 6 2 4 7 3 5 8 4 3
    6 1 7 1 8 3 4 6 5 3 7 4 2 8 5 2
    6 1 8 1 4 7 3 6 5 4 3 8 2 7 5 2
    6 1 8 1 5 3 7 6 4 3 5 8 2 4 7 2
    6 2 3 7 2 8 3 6 4 5 1 7 1 4 8 5
    6 2 3 8 2 7 3 6 5 1 4 1 8 7 5 4
    6 2 5 7 2 4 8 6 5 3 4 7 1 3 1 8
    6 2 5 8 2 3 7 6 5 3 4 1 8 1 7 4
    6 2 7 4 2 5 8 6 4 3 7 5 1 3 1 8
    6 2 7 5 2 8 4 6 3 5 7 4 3 1 8 1
    6 2 7 8 2 3 4 6 5 3 7 4 8 1 5 1
    6 2 8 4 2 7 3 6 4 5 3 8 1 7 1 5
    6 2 8 5 2 4 7 6 3 5 4 8 3 1 7 1
    6 3 5 7 4 3 8 6 5 4 2 7 1 2 1 8
    6 3 5 7 8 3 2 6 5 2 4 7 1 8 1 4
    6 3 7 8 1 3 1 6 4 5 7 2 8 4 2 5
    6 3 8 4 5 3 7 6 4 2 5 8 2 1 7 1
    6 4 1 7 1 8 4 6 3 5 2 7 3 2 8 5
    6 4 1 8 1 7 4 6 2 5 3 2 8 7 3 5
    6 4 7 1 8 1 4 6 3 5 7 2 3 8 2 5
    6 4 7 1 8 1 4 6 5 2 7 3 2 8 5 3
    6 4 7 5 3 8 4 6 3 5 7 1 2 1 8 2
    6 4 7 5 8 2 4 6 2 5 7 3 1 8 1 3
    6 4 8 5 7 2 4 6 2 5 3 8 7 1 3 1
    6 7 1 4 1 8 5 6 4 7 2 3 5 2 8 3
    6 7 3 4 5 8 3 6 4 7 5 1 2 1 8 2
    6 7 5 1 8 1 4 6 5 7 3 4 2 8 3 2
    6 7 5 2 8 4 2 6 5 7 4 3 1 8 1 3
    6 8 1 4 1 5 7 6 4 3 8 5 2 3 7 2
    6 8 2 7 3 2 5 6 3 4 8 7 5 1 4 1
    6 8 3 1 7 1 3 6 4 5 8 2 7 4 2 5
    6 8 5 2 4 7 2 6 5 4 8 3 1 7 1 3
    7 1 3 1 6 8 3 4 7 5 2 6 4 2 8 5
    7 1 3 1 6 8 3 5 7 2 4 6 2 5 8 4
    7 1 3 1 8 5 3 6 7 2 4 5 2 8 6 4
    7 1 4 1 5 6 8 4 7 3 5 2 6 3 2 8
    7 1 4 1 5 8 6 4 7 2 5 3 2 6 8 3
    7 1 4 1 8 6 3 4 7 5 3 2 6 8 2 5
    7 2 3 6 2 8 3 4 7 5 6 1 4 1 8 5
    7 2 3 8 2 4 3 6 7 5 4 1 8 1 6 5
    7 2 4 5 2 6 8 4 7 5 3 1 6 1 3 8
    7 2 4 5 2 8 6 4 7 5 1 3 1 6 8 3
    7 2 4 6 2 5 8 4 7 3 6 5 1 3 1 8
    7 2 6 3 2 8 5 3 7 6 4 1 5 1 8 4
    7 2 8 1 2 1 5 6 7 3 4 8 5 3 6 4
    7 2 8 1 2 1 6 4 7 5 3 8 4 6 3 5
    7 2 8 3 2 4 6 3 7 5 4 8 1 6 1 5
    7 3 1 8 1 3 4 6 7 5 2 4 8 2 6 5
    7 3 4 5 6 3 8 4 7 5 2 6 1 2 1 8
    7 3 6 8 1 3 1 5 7 6 4 2 8 5 2 4
    7 3 8 5 2 3 6 2 7 5 4 8 1 6 1 4
    7 3 8 6 1 3 1 5 7 4 6 8 2 5 4 2
    7 3 8 6 2 3 5 2 7 4 6 8 5 1 4 1
    7 4 1 6 1 8 4 5 7 2 6 3 2 5 8 3
    7 4 2 5 8 2 4 6 7 5 1 3 1 8 6 3
    7 4 2 6 8 2 4 3 7 5 6 3 1 8 1 5
    7 4 6 3 5 8 4 3 7 6 5 1 2 1 8 2
    7 4 6 8 2 5 4 2 7 6 3 5 8 1 3 1
    7 4 8 1 5 1 4 6 7 3 5 8 2 3 6 2
    7 4 8 5 2 6 4 2 7 5 3 8 6 1 3 1
    7 5 1 6 1 8 4 5 7 3 6 4 2 3 8 2
    7 5 1 8 1 3 6 5 7 3 4 2 8 6 2 4
    7 5 2 8 6 2 3 5 7 4 3 6 8 1 4 1
    7 5 3 6 4 8 3 5 7 4 6 1 2 1 8 2
    7 5 6 1 8 1 4 5 7 6 3 4 2 8 3 2
    7 5 6 2 8 4 2 5 7 6 4 3 1 8 1 3
    7 5 8 1 4 1 6 5 7 4 3 8 2 6 3 2
    7 5 8 2 4 6 2 5 7 4 3 8 6 1 3 1
    7 8 1 2 1 6 2 5 7 4 8 3 6 5 4 3
    7 8 1 3 1 5 6 3 7 4 8 5 2 6 4 2
    7 8 2 3 6 2 5 3 7 4 8 6 5 1 4 1
    7 8 3 1 6 1 3 5 7 4 8 6 2 5 4 2
    8 1 2 1 6 2 5 7 4 8 3 6 5 4 3 7
    8 1 2 1 6 2 7 5 3 8 4 6 3 5 7 4
    8 1 2 1 7 2 4 5 6 8 3 4 7 5 3 6
    8 1 2 1 7 2 6 3 5 8 4 3 7 6 5 4
    8 1 3 1 5 6 3 7 4 8 5 2 6 4 2 7
    8 1 3 1 5 7 3 4 6 8 5 2 4 7 2 6
    8 1 3 1 7 4 3 5 6 8 4 2 7 5 2 6
    8 1 4 1 6 7 3 4 5 8 3 6 2 7 5 2
    8 2 3 6 2 5 3 7 4 8 6 5 1 4 1 7
    8 2 3 7 2 4 3 5 6 8 4 7 1 5 1 6
    8 2 4 6 2 5 7 4 3 8 6 5 3 1 7 1
    8 2 4 7 2 6 3 4 5 8 3 7 6 1 5 1
    8 2 5 3 2 6 7 3 5 8 4 1 6 1 7 4
    8 2 7 1 2 1 5 6 4 8 7 3 5 4 6 3
    8 2 7 1 2 1 6 4 5 8 7 3 4 6 5 3
    8 2 7 3 2 6 4 3 5 8 7 4 6 1 5 1
    8 3 1 6 1 3 5 7 4 8 6 2 5 4 2 7
    8 3 5 2 7 3 2 6 5 8 4 1 7 1 6 4
    8 3 5 7 2 3 6 2 5 8 4 7 1 6 1 4
    8 3 7 2 6 3 2 4 5 8 7 6 4 1 5 1
    8 4 1 6 1 7 4 3 5 8 6 3 2 7 5 2
    8 4 2 6 7 2 4 3 5 8 6 3 7 1 5 1
    8 4 2 7 5 2 4 6 3 8 5 7 3 1 6 1
    8 4 5 1 7 1 4 6 5 8 2 3 7 2 6 3
    8 4 5 6 2 7 4 2 5 8 6 3 1 7 1 3
    8 4 5 7 2 6 4 2 5 8 3 7 6 1 3 1
    8 5 1 4 1 6 7 5 4 8 2 3 6 2 7 3
    8 5 2 7 3 2 6 5 3 8 4 7 1 6 1 4
    8 6 1 3 1 7 5 3 6 8 4 2 5 7 2 4
    8 6 3 1 7 1 3 5 6 8 4 2 7 5 2 4
    8 6 4 2 5 7 2 4 6 8 5 3 1 7 1 3
    8 6 4 2 7 5 2 4 6 8 3 5 7 1 3 1
    total:300
    View Code

    n再大复杂度就相当高了,数据比较庞大,这里就不列举了。

    Code

     1 #include<cstdio>
     2 #include<stack>
     3 #include<vector>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<cstring>
     7 #include<iomanip>
     8 using namespace std;
     9 
    10 int n,len,sum=0,p[200],used[200],m,use=0;
    11 //vector<int> vec;
    12 stack<int> s; 
    13 void init(){
    14     memset(p,0,sizeof(p)) ;
    15     memset(used,0,sizeof(used));
    16     use=0;
    17     //vec.clear();    
    18 }
    19 
    20 void permute(int pos){
    21     int i;
    22     if(use>=n){  //use记录本次排列中已用过多少个数
    23        sum++;//排列结果加1
    24         for(int i=0;i<2*n-1;i++) //输出结果
    25           cout<<setw(len)<<p[i]<<" ";
    26         cout<<setw(len)<<p[2*n-1]<<endl;
    27         //init(); //只输出一种。。 
    28         return ;         
    29     }
    30     if(p[pos]==0){ //如果该位置上0  尝试可能的数
    31        for(i=0;i<n;i++){
    32            if(!used[i]){   //如果i+1没有被使用过则考虑
    33                         //pos+i+1+1位置上是否为0
    34                         // 如果是0则i+1放到该位置
    35             if((pos+i+2)<(n*2)){
    36                 if(p[pos+i+2]==0){
    37                     p[pos]=i+1;
    38                     p[pos+i+2]=i+1;
    39                     //vec.push_back(pos);                    
    40                     s.push(pos);
    41                     //if(!s.push(pos)) return;//本次放数位置放入栈
    42                     used[i]=1;
    43                     use++;
    44                     permute(pos+1);//排下一位置
    45                     if(s.empty())  return;
    46                     else{
    47                         //m = vec.back();vec.pop_back();                
    48                           m = s.top();s.pop();
    49                           //回溯,从栈中取出最后一次入栈的位置到m
    50                         used[p[m]-1]=0;
    51                         p[m+p[m]+1]=0;
    52                         p[m]=0;
    53                         use--;
    54                     }                        
    55                 }else
    56                     continue;
    57             }else  
    58                     return; 
    59            }else
    60                    continue;
    61        }                 
    62     }else 
    63         permute(pos+1); //如果第pos位有数,则考察第pos+1位 
    64 }
    65 int Digit(int x){
    66     int cnt=0;
    67     while(x){
    68         cnt++;
    69         x/=10;
    70     }
    71     return cnt;
    72 }
    73 
    74 int main(){
    75     cin>>n;
    76     len = Digit(n);
    77     init();
    78     permute(0);
    79     cout<<"total:"<<sum<<endl;
    80     return 0;
    81 }

    文末附上参考链接

    关于是否有可行排列的问题,请参考:        https://wenku.baidu.com/view/8dcd06bc960590c69ec376e7.html

    参考文献:

        [1].孙陆鹏,吕廷勤.挑剔程序的C程序实现及优化[N].太原城市职业技术学院学报.2007(7):152-153.

             

  • 相关阅读:
    perl 监控网站域名劫持
    OpenLayers访问Geoserver发布的地图
    基于OpenLayers的地图封装Javascript类定义
    Linux_正则表达式
    Linux_正则表达式
    帆软出品: 7点搞定制药企业数据分析系统开发需求
    帆软出品: 7点搞定制药企业数据分析系统开发需求
    Geoserver地图样式SLD资料收集
    GeoServer地图开发解决方案:地图数据处理篇
    Geoserver发布shapfile,中文字段乱码问题
  • 原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/13140389.html
Copyright © 2011-2022 走看看