跳转至

循环嵌套的应用02-排列与组合

从 [1, n] 选 3 个数字。

排列看顺序,组合不看顺序。 比如 1 2 3 和 3 2 1,是不同的排列,但属于同一种组合。

字典序,就是先比较第一个数,相同再比较第二个数,再比较第三个数。

下面的代码中,n 已经读入。

排列,数字可以重复使用

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
        for (int k = 1; k <= n; k++) {
            cout << i << ' ' << j << ' ' << k << '\n';
        }
    }
}

每个位置,都可以从 1 选到 n。

n = 2 时,输出:

1 1 1
1 1 2
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1
2 2 2

排列,数字不可以重复使用

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
        for (int k = 1; k <= n; k++) {
            if (i != j && i != k && j != k) {
                cout << i << ' ' << j << ' ' << k << '\n';
            }
        }
    }
}

三个数,要两两不同。

n = 3 时,输出:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

组合,数字可以重复使用

for (int i = 1; i <= n; i++) {
    for (int j = i; j <= n; j++) {
        for (int k = j; k <= n; k++) {
            cout << i << ' ' << j << ' ' << k << '\n';
        }
    }
}

限制 i <= j <= k,同一组数字只输出一种顺序,避免重复。

n = 2 时,输出:

1 1 1
1 1 2
1 2 2
2 2 2

组合,数字不可以重复使用

for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) {
        for (int k = j + 1; k <= n; k++) {
            cout << i << ' ' << j << ' ' << k << '\n';
        }
    }
}

限制 i < j < k,既不重复使用数字,也不重复输出同一种组合。

n = 4 时,输出:

1 2 3
1 2 4
1 3 4
2 3 4