首页 > 解决方案 > 查找 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++ 中执行此操作。

标签: c++for-loop

解决方案


为了使事情更容易,我将 ak和value 组合成一个对象。我们称它为 KAB 对象,或:abkab

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 超时。这在本地应该可以正常工作)。


推荐阅读