for
(int i =
1; i <= n; i++
)}
if
(m == n)
當遞迴層數m(從0開始)與n相等時,輸出一種組合,並return進行回溯。
完整**如下:
void
func
(int m,
int n,
bool visited)
cout << endl;
return;}
for(
int i =
1; i <= n; i++)}
}//呼叫方法: func(0, n, visited);
全排列問題的變形:
[noip2004 普及組] 火星人
問題描述:
設正整數n為排列的長度,全排列n並按照從小到大的順序排列,每一種排列組合代表乙個數字,例如:
123代表的數字132213
231312
321
123給定乙個正整數m,將m加到某個長度為n的排列所代表的數字上,求該數字所對應的排列。456
問題分析:這道題和全排列是比較像的,全排列的所有輸出結果本身就是從小到大進行排列的,所以我只需要在找到指定排列之後再進行m次回溯。
搜尋部分:
for
(int i =
1; i <= n; i++)if
(!visited[i -1]
)}
可以看到我只對**進行了小部分的修改,flag為0代表還在尋找給定排列的階段。加flag==0這乙個判斷主要是為了和後面的回溯進行區分。
if
(k == n)
exit(0
);}return
;}
當遞迴層次到達n時,開始進行回溯,尋找+m後的數字所對應的排列,這裡的處理是對flag進行累加,當flag從0累加到m+1之後,說明程式找到了給定排列之後的第m個排列,輸出然後exit退出程式。
完整**:
#include
#include
#include
using
namespace std;
int a[
10100];
bool visited[
10100];
int cnt =0;
int flag =0;
int m, n;
void
func
(int k,
bool visited)
exit(0
);}return;}
for(
int i =
1; i <= n; i++)if
(!visited[i -1]
)}}int
main()
列舉排列問題
輸入乙個整數n,按字典序從大到小的順序輸出前n個數的所有排序。以下列出常用的兩種方法。遞迴列舉法 includeusing namespace std void printf permutation int n,int a,int cur 使用stl中的next permutation法 inclu...
遞迴 指數列舉 排列列舉
題目描述 從 1 n這 n n 16 個整數中隨機選取任意多個,輸出所有可能的選擇方案。輸入描述 乙個整數n。輸出描述 每行一種方案。同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。對於沒有選任何數的方案,輸出空行。本題有自定義校驗器 spj 各行 不同方案 之間的順序任意。輸入 輸出3 ...
列舉排列 筆記
題目 輸入正整數 n 按照字典序從小到大的順序的前 n 個數的所有排列。提示 兩個序列字典序關係大小關係等價於從頭開始第乙個不相同位置大小關係。即 思考 以 1 開頭的排列開始討論 第一位是 1,後面 2 9 按照字典序排序,2 9 的排列又符合 以 2 開頭的排列。出現了!是你!遞迴!includ...