描述項鍊排序的計算方法
基本介紹
- 中文名:項鍊排列
- 定義:描述項鍊排序的計算方法
- 屬性:組合數學中一個很常見的問題
- 特徵:可以在圓排列的基礎上求解
項鍊排列生成算法
算法正確性證明
C/C++遞歸實現
#include <algorithm>#include <stdio.h>#include <cstdio>#include <cstring>#define MAX_NUM 32using namespace std;typedef uint32_t T;T p[MAX_NUM];int n;void init_p() { for (int i = 0; i < n; i++) p[i] = i + 1;}inline void swap_circle(int i, int j) { T tmp = p[i]; p[i] = p[j]; p[j] = tmp;}/*輸出*/inline void output(int start) { for(int i = 0 ; i < n ; i += 1) { printf("%d", p[(start + i) % n]); if(i != n-1) printf(" "); } printf("\n");}/* 項鍊排列生成 */void generate(int len) { if (n <= 3) { output(0); return; } if (len == n) { T tmp[MAX_NUM]; memcpy(tmp, p, n * sizeof(T)); for (int i = 1; i < n; ++i) { output_circle(); swap_circle(n-i,n-i-1); } memcpy(p, tmp, n * sizeof(T)); return; } else { T tmp[MAX_NUM]; memcpy(tmp, p, n * sizeof(T)); for (int i = 0; i < len - 1; i++) { generate_circle(len + 1); swap_circle(len - 1 - i, len - 2 - i); } memcpy(p, tmp, n * sizeof(T)); }}int main(int argc, char * argv[]) { scanf("%d", &n); init_p(); //freopen("output.txt", "w",stdout); /*輸出到檔案*/ generate(4); return 0;}