【问题标题】:printling all probable outcomes c++?打印所有可能的结果 C++?
【发布时间】:2016-03-02 04:00:17
【问题描述】:

您好,我正在尝试弄清楚如何编写代码以使其循环并>打印所有可能的结果,例如,如果我们从数组开始。

string alphabet[2][4] = { {"A","D","G","J"},
                          {"B","E","H","K"}};

现在我需要一组循环来打印出所有不同的可能结果 使用应该得出 16 种可能结果的每个元素。

示例结果是:

ADGJ
ADGK
ADHJ
ADHK
etc....

【问题讨论】:

  • 您需要使用循环吗?或者允许使用最好的工具来完成这项工作?

标签: c++ loops multidimensional-array permutation


【解决方案1】:

您正在寻找组合。

您可以使用递归生成器,例如:

Live On Coliru

#include <string>
#include <iostream>

template<typename F>
void combis(char const* a, char const* b, F f, std::string state = "") {
    if (a && b && *a && *b) {
        combis(a+1, b+1, f, state + *a);
        combis(a+1, b+1, f, state + *b);
    } else
    {
        f(state);
    }
}

int main() {
    combis("ADGJ", "BEHK", [](auto s) { std::cout << "Found: '" << s << "'\n"; });
}

打印

Found: 'ADGJ'
Found: 'ADGK'
Found: 'ADHJ'
Found: 'ADHK'
Found: 'AEGJ'
Found: 'AEGK'
Found: 'AEHJ'
Found: 'AEHK'
Found: 'BDGJ'
Found: 'BDGK'
Found: 'BDHJ'
Found: 'BDHK'
Found: 'BEGJ'
Found: 'BEGK'
Found: 'BEHJ'
Found: 'BEHK'

【讨论】:

    【解决方案2】:

    在生成组合和排列时经常出现这种情况,这可以被视为(和解决)一个简单的计数问题。

    在这种情况下,您在四个位置中的每一个位置都有两种可能性。简而言之,你真正拥有的是一个 4 位二进制数,带有一些相当奇怪的“数字”。既然如此,我们可以简单地从 0 数到 15,并使用该数字的位作为索引来选择正确的“数字”显示在输出中。

    执行此操作的代码可能如下所示:

    char output[][2] = { { 'A', 'B'}, {'D', 'E'}, { 'G', 'H'}, {'J', 'K'} };
    
    for (int i = 0; i < 15; i++) {
        for (int j = 0; j < 4; j++)
            std::cout << output[j][(i>>(3-j)) & 1];
        std::cout << "\n";
    }
    

    虽然它显然不是(甚至接近于)完成这项工作的唯一方法,甚至可能不是最明显的方法,但我认为它至少比大多数替代方法更简单。

    【讨论】:

      【解决方案3】:

      如果允许您使用 STL 的功能,std::next_permutation 函数将完全满足您的需求:

      std::vector<std::vector<std::string>> alphabet = { {"A","D","G","J"},
                                                         {"B","E","H","K"}};
      
      for(auto& v : alphabet) {
          std::sort(v.begin(), v.end());
          do {
              for(const auto& c : v) {
                  std::cout << c << std::endl;
              }
          } while(std::next_permutation(v.begin(), v.end());
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-13
        • 2016-02-25
        • 2022-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 2013-07-14
        • 1970-01-01
        相关资源
        最近更新 更多