忘了在哪個站看到,題目是:"把 1、2、3、4、5 的所有排列情形列出",格主說他當時不會用recursive,就用迴圈做出,留言裏有提到STL的next_permutation,今天抽空試了一下多年沒碰的STL。
注意:若要走遍所有的排序,next_permutation的輸入必須由小到大排序過,prev_permutation是由大到小排序。所以若使用亂序的陣列做列舉,記得要先排序。
Update:感謝破百的老兵指正。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[] = {1,2,3,4,5};
do
{
cout << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << " " << a[4] << endl;
}while (next_permutation(a,a+5));
return 0;
}
果然是很優雅的寫法,看來這演算法也可應用到棋盤的窮舉法呀!注意:若要走遍所有的排序,next_permutation的輸入必須由小到大排序過,prev_permutation是由大到小排序。所以若使用亂序的陣列做列舉,記得要先排序。
Update:感謝破百的老兵指正。
留言
sgi doc Notes:
[2] Note that the lexicographically smallest permutation is, by definition, sorted in nondecreasing order.
請問可以參考你的文章
放在我的報告裡嗎
因為要寫一個52!的perm...還需要改寫..
thanks in adv.
你要加強基本功才是呀!這叫做Dynamic Array 。若是C用malloc,C++用new。
隨便寫寫,請在作業後面註明:感謝鳥毅教導C++,哈哈。
#include
#include
using namespace std;
int main()
{
int size;
cout << "請輸入陣列大小 1 ~ 10: ";
cin >> size;
int *a = new int[size];
for(int i=0; i<size; i++)
{
a[i] = i+1;
}
do
{
for(int i=0; i< size; i++)
{
cout << a[i] << " ";
}
cout << endl;
}while (next_permutation(a, a+size));
delete [] a;
return 0;
}