所有可能的多项选择问题的排列

时间:2013-05-22 21:42:26

标签: c#

我们在C#中构建了一个工具,向用户询问一系列多项选择题,然后根据他们的答案显示产品列表。

我们没有做任何复杂的逻辑,我们只有与特定答案相关的产品,如果选择了答案,那么该产品会被添加到结果列表中。

我们最终会得到我们获得所有产品或没有产品的情况,因此我们需要看一下更彻底的逻辑编码方式。

首先,我在C#中构建一个实用程序应用程序来帮助我们验证该工具。我希望该实用程序执行的第一项任务是返回所有可能的答案组合。我陷入了困境。这是让我头疼的数学问题之一。这是问题的样子:

  • 问题1
    • 回答1
    • 回答2
  • 问题2
    • 回答1
    • 回答2
    • 回答3
  • 问题3
    • 回答1
    • 回答2
    • 回答3
  • 问题4
    • 回答1
    • 回答2

有人可以让我开始正确的方向,如何通过C#返回所有可能的答案组合列表?感谢。

2 个答案:

答案 0 :(得分:9)

您想要的操作称为笛卡尔积。例如,如果第一和第二个问题的可能答案为{ a, b, c }{ d, e },则笛卡尔积为{ {a, d}, {b, d}, {c, d}, {a, e }, {b, e}, {c, e} }

我写了一篇关于计算任意多个序列的笛卡尔积的文章;你可以在这里找到它:

http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx

另请参阅此StackOverflow问题:

Generating all Possible Combinations

答案 1 :(得分:1)

这是一个简单的例子,希望能够说明一种(递归)技术:

void Main()
{
     int[] counts = new [] { 2, 2 };
     Choose(counts, 0, new Stack<string>());
}

void Choose(int[] AnswerCounts, int start, Stack<string> chosen) {
    for (int a=1; a<= AnswerCounts[start]; a++) {
        chosen.Push("Answer " + a.ToString());
        if (start < AnswerCounts.Length-1) {
            Choose(AnswerCounts, start+1, chosen);              
        }   
        else {                  
            Console.WriteLine(string.Join(", ", chosen.ToArray()));         
        }
        chosen.Pop();
    }   
}

输出:

Answer 1, Answer 1 
Answer 2, Answer 1 
Answer 1, Answer 2 
Answer 2, Answer 2