挑剔數列介紹:
挑剔數列問題是一個有趣的數學問題。
給定正整數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
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
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.