c++ - 查找 for 循环输出的所有 3 组合
问题描述
我觉得这应该很简单,但我无法解决。
我有一段非常简单的 c++ 代码。
for (int k = 0; k < 2; ++k)
{
for (int a = 0; a < 4; ++a)
{
for (int b = 0; b < 4; ++b)
{
if (a != b)
{
std::cout << "k: " << k << " a: " << a << " b: " << b << "\n";
}
}
}
输出将有 24 行这样
k: 0 a: 0 b: 1
k: 0 a: 0 b: 2
k: 0 a: 0 b: 3
k: 0 a: 1 b: 0
k: 0 a: 1 b: 2
k: 0 a: 1 b: 3
k: 0 a: 2 b: 0
k: 0 a: 2 b: 1
k: 0 a: 2 b: 3
k: 0 a: 3 b: 0
k: 0 a: 3 b: 1
k: 0 a: 3 b: 2
k: 1 a: 0 b: 1
k: 1 a: 0 b: 2
k: 1 a: 0 b: 3
k: 1 a: 1 b: 0
k: 1 a: 1 b: 2
k: 1 a: 1 b: 3
k: 1 a: 2 b: 0
k: 1 a: 2 b: 1
k: 1 a: 2 b: 3
k: 1 a: 3 b: 0
k: 1 a: 3 b: 1
k: 1 a: 3 b: 2
我想要的本质上是这 24 行输出中的 3 种选择。24 选择 3 = 2024 行输出,无需任何额外的库使用。我想一次根据这 24 行中的 3 行进行一些计算。
等效的python代码
import itertools
iterable = ["k: 0 a: 0 b: 1", "k: 0 a: 0 b: 2", "k: 0 a: 0 b: 3", "k: 0 a: 1 b: 0", "k: 0 a: 1 b: 2", "k: 0 a: 1 b: 3", "k: 0 a: 2 b: 0", "k: 0 a: 2 b: 1", "k: 0 a: 2 b: 3", "k: 0 a: 3 b: 0", "k: 0 a: 3 b: 1", "k: 0 a: 3 b: 2", "k: 1 a: 0 b: 1", "k: 1 a: 0 b: 2", "k: 1 a: 0 b: 3", "k: 1 a: 1 b: 0", "k: 1 a: 1 b: 2", "k: 1 a: 1 b: 3", "k: 1 a: 2 b: 0", "k: 1 a: 2 b: 1", "k: 1 a: 2 b: 3", "k: 1 a: 3 b: 0", "k: 1 a: 3 b: 1", "k: 1 a: 3 b: 2"]
a = list(itertools.combinations(iterable, 3))
print(a)
展示了我想要的。我想知道如何仅使用for
循环在 C++ 中执行此操作。
解决方案
为了使事情更容易,我将 ak
和value 组合成一个对象。我们称它为 KAB 对象,或:a
b
kab
struct kab {
int k, a, b;
};
然后,我将创建一个increment
函数,该函数将采用 akab
并为我们提供kab
序列中的下一个。这将使我们能够将所有三个循环压缩为一个,并使从序列中的任何点进行迭代变得更加容易。这可能看起来像:
kab increment(kab obj) {
obj.b = (obj.b + 1) % (MAX_B + 1);
if(obj.b == 0) {
obj.a = (obj.a + 1) % (MAX_A + 1);
if(obj.a == 0) {
obj.k++;
}
}
// Ensure a != b by incrementing again if they are
if(obj.a == obj.b) {
return increment(obj);
}
return obj;
}
最后,这只是做实际增量的问题。这是一个例子:
while(vals.k <= MAX_K) {
kab vals2 = increment(vals);
while(vals2.k <= MAX_K) {
kab vals3 = increment(vals2);
while(vals3.k <= MAX_K) {
std::cout << "k: " << vals.k << " a: " << vals.a << " b: " << vals.b << std::endl;
std::cout << "k: " << vals2.k << " a: " << vals2.a << " b: " << vals2.b << std::endl;
std::cout << "k: " << vals3.k << " a: " << vals3.a << " b: " << vals3.b << std::endl;
std::cout << std::endl;
vals3 = increment(vals3);
}
vals2 = increment(vals2);
}
vals = increment(vals);
}
查看它在此处运行:https ://ideone.com/9cVHuG(请注意,大量输出会导致 ideone 超时。这在本地应该可以正常工作)。
推荐阅读
- javascript - Django:在 AJAX 调用后无法从我的视图中检索变量
- php - paypal 结账 onApprove 功能
- jenkins - 当构建过程需要多个存储库时如何使用 Jenkins 多分支管道
- swift - 基于索引路径的限制行选择
- laravel - Laravel 中的多重身份验证问题
- clojure - 在 Clojure 中应用 plus 函数
- amazon-web-services - 如何将 AWS Amplify 控制台中的现有应用程序与 AWS Amplify CLI 连接?
- python - 是否可以将单元格与 openpyxl 只写工作表合并?
- node.js - 语法或异步问题
- php - Laravel TDD 断言数组具有键“id”失败