2018年3月14日 星期三

n 取 n 逆時鐘旋轉排列法


#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
請按任意鍵繼續 . . .





2 則留言:

  1. //恭喜你設計出新的排列組合程式,
    //我幫你做了一個有define變數的版本,
    //n-->A , r-->B ,
    //並且計算出Cnr的組合數字,取名為N2。


    // 請到下列網址拷貝貼上程式碼:
    // test002.cpp: 定義主控台應用程式的進入點。
    // 網址: https://joeymovieyoutube.blogspot.com/2018/03/re-n-n.html

    回覆刪除
    回覆
    1. 這種排列法的特點是有它的順序性,但要處理旋轉,所以不是最快的,以下這個應該是最快的

      http://hugedream.blogspot.tw/2009/07/permutation-to-iterate-is-human-to.html

      刪除