作者kinwind ()
看板C_Sharp
标题Re: [问题] 一个递回问题
时间Mon Feb 20 10:34:49 2012
※ 引述《wildcupid (小渔歌)》之铭言:
: 今天在写一个想破脑袋还是写不出来
: 希望有神人可以帮帮我
: 以下是一个小例子
: 假设有三堆东西
: 每一堆里面的东西都不一样且数量也不同
: 例如第一堆有 苹果 橘子
: 第二堆有 芭乐
: 第三堆有 西瓜 柠檬
: (以上每堆中的水果都各一个)
: 然後我现在想做的事情就是从每一堆中选一个水果出来
: 也就是想要求出所有的组合
: 所以会有 苹果 芭乐 西瓜
: 苹果 芭乐 柠檬
: 橘子 芭乐 西瓜
: 橘子 芭乐 柠檬
贴个不同的作法,不用递回的方式且支援动态的加入新的水果堆数
static void Main(string[] args)
{
// 不同种类的水果
var fruit = new List<string[]>
{
new[] {"a", "b", "c"},
new[] {"b", "c", "d","e"},
new[] {"a", "c", "e"},
new[] {"x", "b", "c","a"}
};
// 全部的组合
var all = new List<string[]>();
var count = new int[fruit.Count];
bool run = true;
while (run)
{
var o = new string[fruit.Count];
for (int i = 0; i < count.Length; i++)
{
if (count[i] > fruit[i].Length - 1)
{
if (i < fruit.Count - 1)
{
count[i + 1]++;
count[i] = 0;
}
else
{
run = false;
}
}
if (run)
{
o[i] = fruit[i][count[i]];
}
}
if (run)
{
all.Add(o);
}
count[0]++;
}
// 输出所有组合
foreach (var array in all)
{
Console.WriteLine(String.Join(",", array));
}
Console.ReadKey();
}
只是提出个不同的作法,试过是可行,原理就是用数字一直加一
把每一种组合都跑过
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.250.147.122
※ 编辑: kinwind 来自: 60.250.147.122 (02/20 10:36)