原始代碼採用遞歸實現階乘計算與排列生成,導致在較大 n 時出現超時。主要瓶頸在於遞歸調用開銷大、數組操作未優化、且部分邏輯存在錯誤(如 reverse 函數循環條件寫錯)。
next_permutation)。printf 替代 cout,或一次性輸出緩衝。#include <stdio.h>
#define MAXN 105
int a[MAXN];
int n;
void swap(int *x, int *y) {
int tmp = *x; *x = *y; *y = tmp;
}
void reverse(int left, int right) {
while (left < right) swap(&a[left++], &a[right--]);
}
int next_permutation() {
int i = n - 1;
while (i >= 1 && a[i] >= a[i+1]) i--;
if (i < 1) return 0;
int j = n;
while (a[j] <= a[i]) j--;
swap(&a[i], &a[j]);
reverse(i+1, n);
return 1;
}
void print_arr() {
for (int i = 1; i <= n; i++) printf("%d ", a[i]);
printf("\n");
}
int main() {
while (scanf("%d", &n) == 1) {
for (int i = 1; i <= n; i++) a[i] = i;
print_arr();
while (next_permutation()) print_arr();
}
return 0;
}
next_permutation 返回 0 表示已到最後一個排列,主循環即可終止。