討論區快速選單
知識庫快速選單
討論區最近新進100則主題 政府補助!學嵌入式+物聯網 沒有人比Cloudera更了解大數據
[ 回上頁 ] [ 討論區發言規則 ]
n 取 r 逆時鐘旋轉排列法
更改我的閱讀文章字型大小
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1003 | 人氣 3227 | 評價 1260 | 評價/貼文 1.26 | 送出評價 27 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/3/15 上午 10:40:32
#include <functional>  // std::function
#include <memory>    // std::shared_ptr
#include <vector>
#include <iostream>

using namespace std;

// n 取 r 做排列
// 採用逆時旋轉排列法
// 必須 n >= r
class Permutation_nPn
{
 // 回報結果
 function<void(const shared_ptr<vector<unsigned char> > &, size_t)> m_Report;
 // 放置要排列的數字
 shared_ptr <vector<unsigned char> > m_Digital_Array;
 // 要做排列的數目值
 size_t m_r;

 void v(size_t n, size_t r)
 {
  size_t i = n + 1;
  while (i--)
  {
   if (r == 0)
    m_Report(m_Digital_Array, m_r);
   else
    v(n - 1, r - 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() {}

 Permutation_nPn(function<void(const shared_ptr<vector<unsigned char> > &, size_t)> &Receive)
  :m_Report(Receive)
 {}

 void nPr(size_t n, size_t r)
 {
  m_r = r;

  m_Digital_Array = shared_ptr<vector<unsigned char> >(new vector<unsigned char>(n));
  size_t i = n;
  while (i--)
  {
   m_Digital_Array->at(i) = i;
  }

  v(n - 1, r - 1);
 }
};

int N = 1;
void Show(const shared_ptr<vector<unsigned char> > &Digital_Array, size_t r)
{
 cout << N << ":\t";

 for (size_t i = Digital_Array->size() - 1; r > 0; --i, --r)
  cout << (int)Digital_Array->at(i) << ' ';
 cout << endl;
 ++N;
}

int main()
{
 function<void(const shared_ptr<vector<unsigned char> > &, size_t)> Reprot(Show);
 Permutation_nPn P(Reprot);

 cout << "4P3 排列:" << endl;
 N = 1;
 P.nPr(4, 3);

 return 0;
}

執行結果:

4P3 排列:
1:   3 2 1
2:   3 2 0
3:   3 1 0
4:   3 1 2
5:   3 0 2
6:   3 0 1
7:   2 1 0
8:   2 1 3
9:   2 0 3
10:   2 0 1
11:   2 3 1
12:   2 3 0
13:   1 0 3
14:   1 0 2
15:   1 3 2
16:   1 3 0
17:   1 2 0
18:   1 2 3
19:   0 3 2
20:   0 3 1
21:   0 2 1
22:   0 2 3
23:   0 1 3
24:   0 1 2
請按任意鍵繼續 . . .
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.125