首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言全排列組合:從 1,2,3,4 中取 3 個數組成互不相同三位數的三種算法

     編輯:程式設計綜合問答

題目:數字 {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);

方法二:遞歸回溯 + used 數組(通用全排列模板)

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; // 回溯
        }
    }
}

方法三:C++ STL next_permutation(工程實戰首選)

#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

進階:組合數 C(4,3)=4 再全排列 3! = 6 → 24

先用組合算法選 3 個數,再對這 3 個數全排列,邏輯更清晰,代碼可復用 comb + perm 兩個通用函數。

掌握回溯模板 + used 數組 + path 數組,所有排列組合、子集、N 皇后、數獨解題通殺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved