#include <functional> // std::function
#include <memory> // std::shared_ptr
#include <vector>
#include <iostream>
using namespace std;
// n 取 n 做排列
// 採用逆時旋轉排列法
class Permutation_nPn
{
// 回報結果
function<void(const shared_ptr<vector<unsigned char> > &)> m_Report;
// 放置要排的數字
shared_ptr <vector<unsigned char> > m_Digital_Array;
void v(size_t n)
{
if (n == 0)
m_Report(m_Digital_Array);
else
{
size_t i = n + 1;
while (i--)
{
v(n - 1);
unsigned char tmp = m_Digital_Array->at(n);
for (size_t j = n; j > 0; --j)
m_Digital_Array->at(j) = m_Digital_Array->at(j - 1);
m_Digital_Array->at(0) = tmp;
}
}
}
public: Permutation_nPn(
const function<void(const shared_ptr<vector<unsigned char> > &)>
&Receive
)
:m_Report(Receive)
{}
void nPn(size_t n)
{
m_Digital_Array = shared_ptr<vector<unsigned char> >(
new vector<unsigned char>(n));
size_t i = n;
while (i)
{
m_Digital_Array->at(i - 1) = i - 1;
--i;
}
v(n - 1);
}
};
int N = 1;
void Show(const shared_ptr<vector<unsigned char> > &Digital_Array)
{
cout << N << ":\t";
for (size_t i = Digital_Array->size(); i > 0; --i)
cout << (int)Digital_Array->at(i - 1) << ' ';
cout << endl;
++N;
}
int main()
{
Permutation_nPn P(Show);
cout << "4! 排列:" << endl;
N = 1;
P.nPn(4);
return 0;
}
執行結果:
4! 排列:
1: 3 2 1 0
2: 3 2 0 1
3: 3 1 0 2
4: 3 1 2 0
5: 3 0 2 1
6: 3 0 1 2
7: 2 1 0 3
8: 2 1 3 0
9: 2 0 3 1
10: 2 0 1 3
11: 2 3 1 0
12: 2 3 0 1
13: 1 0 3 2
14: 1 0 2 3
15: 1 3 2 0
16: 1 3 0 2
17: 1 2 0 3
18: 1 2 3 0
19: 0 3 2 1
20: 0 3 1 2
21: 0 2 1 3
22: 0 2 3 1
23: 0 1 3 2
24: 0 1 2 3
請按任意鍵繼續 . . .
//恭喜你設計出新的排列組合程式,
回覆刪除//我幫你做了一個有define變數的版本,
//n-->A , r-->B ,
//並且計算出Cnr的組合數字,取名為N2。
// 請到下列網址拷貝貼上程式碼:
// test002.cpp: 定義主控台應用程式的進入點。
// 網址: https://joeymovieyoutube.blogspot.com/2018/03/re-n-n.html
這種排列法的特點是有它的順序性,但要處理旋轉,所以不是最快的,以下這個應該是最快的
刪除http://hugedream.blogspot.tw/2009/07/permutation-to-iterate-is-human-to.html