題目:數字 {1,2,3,4} 組成互不相同、無重復的三位數,共幾個?要求三種方法。
排列數 P(4,3) = 4 × 3 × 2 = 24 個。
for (int i = 1; i <= 4; i++)
for (int j = 1; j <= 4; j++)
for (int k = 1; k <= 4; k++)
if (i != j && i != k && j != k)
printf("%d%d%d\n", i, j, k);
int a[4] = {1,2,3,4};
int path[3];
bool used[5] = {0};
void dfs(int depth) {
if (depth == 3) {
for (int i = 0; i < 3; i++) printf("%d", path[i]);
printf("\n");
return;
}
for (int i = 0; i < 4; i++) {
if (!used[a[i]]) {
used[a[i]] = true;
path[depth] = a[i];
dfs(depth + 1);
used[a[i]] = false; // 回溯
}
}
}
#include
#include
#include
int main() {
std::vector v = {1,2,3,4};
std::sort(v.begin(), v.end());
do {
// 取前 3 位
std::cout << v[0] << v[1] << v[2] << '\n';
} while (std::next_permutation(v.begin(), v.end()));
}
| 方法 | 時間複雜度 | 適用場景 |
|---|---|---|
| 多層循環 | O(n^k) k固定時 O(1) | k ≤ 3、快速驗證、無庫環境 |
| 回溯遞歸 | O(P(n,k)) | k 可變、需剪枝、教學演示 |
| STL/庫函數 | O(P(n,k)) | 生產代碼、可讀性高、無 bug |
先用組合算法選 3 個數,再對這 3 個數全排列,邏輯更清晰,代碼可復用 comb + perm 兩個通用函數。
掌握回溯模板 + used 數組 + path 數組,所有排列組合、子集、N 皇后、數獨解題通殺。