循环嵌套的应用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 时,输出:
排列,数字不可以重复使用¶
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 时,输出:
组合,数字可以重复使用¶
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 时,输出:
组合,数字不可以重复使用¶
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 时,输出: