7 2列舉排列

2021-07-11 08:45:00 字數 1078 閱讀 6935

7.2.1生成1~n 的排列

問題描述:

輸入整數n,按照字典序從小到大列印出1-n的去所有排列。兩個序列的字典序大小關係等價於從頭開始第乙個不相同處的大小關係,(例如(1,2,3)<(3,2,1)),n=3時,輸出結果是:(1,2,3)(1,3,2)(2,1,3)(2,3,1)(3,1,2)(3,2,1).

演算法思想:

設集合s是保持帶排列元素的集合,陣列a保持排列的元素。

如果集合s為空,則表示完成了乙個排列,不再繼續遞迴,否則將s中的元素v加入到a中,且s = s-,繼續遞迴尋找下乙個可以加入到排列中的元素。

#include

using namespace std;

void print_permutation(int n, int *a, int cur)

else for (i = 1; i <= n; i++)//嘗試在a[cur]中添各種整數}}

int main()

cout << endl;

}else for (i = 0; i > n)

sort(p, p + n);

print(n, p,a,cur);

}return 0;

}

7.2.3解答樹!

7.2.4 下乙個排列

列舉所有排列的另乙個方法是從字典序最小的排列開始,不停呼叫「求下乙個排列」的過程。           如何求下乙個排列呢?c++的stl中提供了乙個庫函式next_permutation。

用next_permutation和prev_permutation求排列組合很方便,但是要記得包含標頭檔案#include 。

雖然最後乙個排列沒有下乙個排列,用next_permutation會返回false,但是使用了這個方法後,序列會變成字典序列的第乙個,如cba變成abc。prev_permutation同理。

#include

#include

using namespace std;

int main()

while (next_permutation(p, p + n));

return 0;

}

9 4 列舉型別

乙個變數只有幾種可能的取值,可以一一枚舉出來,變數的取值僅限於列舉的值的有限範圍內,而不適宜用整型 實型 字元型直接表示,c語言提供了這種列舉資料型別。例如,一年的四季有春夏秋冬 乙個星期有星期日 星期一到星期六等。定義列舉型別的一般形式為 enum 列舉型別名 如 enum weekday 1.列...

146 列舉型別

除了簡單的變數型別之外,c 還提供了3個複雜的變數 列舉,結構和陣列。列舉型別的定義 enum 列舉型別的宣告 列舉型別的賦值 在遊戲中我們可以定義乙個int型別來儲存狀態 0 遊戲暫停 1遊戲失敗 2遊戲勝利 3開始選單,但是這樣不容易閱讀,而且容易出錯。這個時候我們通過列舉型別來解決 enum ...

3 5 9 列舉型別

有時,變數的取值只在乙個有限的集合內。例如 銷售的服裝或服裝只有小 中 大 和超大的四種尺寸。當然,可以將這些尺寸分別編碼為1 2 3 4或s m l x。但這樣存在著一定的隱患。在變數中很可能儲存的是乙個錯誤的值 如0或m 針對這種情況,可以自定義列舉型別。列舉型別包括有限個命名的值。例如,enu...