C#高级置换方案 [英] C# advanced permutation scenario
问题描述
我试图找出如何如何找到给出以下信息所有组合:
I am trying to figure how how to find all the combinations given the following information:
我开始一个JSON数据:
I start with a JSON dataset:
var choices = { 1: {'Q': 100, 'R': 150, 'W' : 250, 'T', 30},
2: {'Q': 90, 'R': 130, 'W' : 225, 'T', 28},
3: {'Q': 80, 'R': 110, 'W' : 210, 'T', 25},
4: {'Q': 70, 'R': 90, 'W' : 180, 'T', 22},
5: {'Q': 60, 'R': 70, 'W' : 150, 'T', 18},
6: {'Q': 50, 'R': 50, 'W' : 110, 'T', 15},
7: {'Q': 40, 'R': 30, 'W' : 80, 'T', 11},
8: {'Q': 30, 'R': 25, 'W' : 50, 'T', 8},
9: {'Q': 20, 'R': 10, 'W' : 25, 'T', 5},
10: {'Q': 10, 'R': 5, 'W' : 15, 'T', 3}
};
我试图找出是如何可以借此数据,并生成所有可能的组合选择无论是'Q'时,'R','W',或'T'的每个行元素。
What I'm trying to figure out is how I can take this dataset, and generate all possible combinations when selecting either the 'Q', 'R', 'W', or 'T' element for each row.
所以,我希望我的最终结果将是什么样这种
So I hope my end result will be something like this
var allChoices = { 0: {1: {'Q': 100},
2: {'R': 130},
3: {'W' : 210},
4: {'W' : 180},
5: {'T', 18},
6: {'R': 50,},
7: {'Q': 40,},
8: {'T', 8},
9: {'R': 10},
10: {'W' : 15},
},
1: {...},
...
1048576: {...}
};
我使用JSON,因为我认为这是最简单的可视化,但没有人知道我怎么会去在C#实现这个?
I used JSON because I think it is the easiest to visualize but does anyone know how I could go about accomplishing this in c#?
让我知道,如果这还不够清楚我有一个很难搞清楚究竟怎么问这个问题。
Let me know if this not clear enough I'm having a hard time figuring out how exactly to ask this question.
推荐答案
下面是如何利用深度优先递归来做到这一点。需要大约3秒,我的机器上运行。同时这会为一个任意大小的配对,通过改变PAIRCOUNT说5,如果你有5列,而不是4和公正。新增了对附加的适当工作。
Here's How to do it using depth first Recursion. Takes about 3 seconds to run on my machine. Also this will work for an arbitrary sized pairing by changing the PAIRCOUNT to say 5 if you had 5 columns instead of 4 and just .add the additional Pairs as appropriate.
void Main()
{
var OriginValues = new List<KeyValuePair<char, int>>();
OriginValues.Add(new KeyValuePair<char, int>('Q', 100));
OriginValues.Add(new KeyValuePair<char, int>('R', 150));
OriginValues.Add(new KeyValuePair<char, int>('W', 250));
OriginValues.Add(new KeyValuePair<char, int>('T', 30));
OriginValues.Add(new KeyValuePair<char, int>('Q', 90));
OriginValues.Add(new KeyValuePair<char, int>('R', 130));
OriginValues.Add(new KeyValuePair<char, int>('W', 225));
OriginValues.Add(new KeyValuePair<char, int>('T', 28));
OriginValues.Add(new KeyValuePair<char, int>('Q', 80));
OriginValues.Add(new KeyValuePair<char, int>('R', 110));
OriginValues.Add(new KeyValuePair<char, int>('W', 210));
OriginValues.Add(new KeyValuePair<char, int>('T', 25));
///... and the other 7
var AllPermutation = new List<List<KeyValuePair<char, int>>>();
Recurse(OriginValues, ref AllPermutation);
//all results will be in AllPermutation now
}
const int PAIRCOUNT = 4;
void Recurse(List<KeyValuePair<char, int>> OriginValues, ref List<List<KeyValuePair<char, int>>> result, List<KeyValuePair<char, int>> itemset = null)
{
itemset = itemset ?? new List<KeyValuePair<char, int>>();
var temp = new List<KeyValuePair<char, int>>(itemset);
if (itemset.Count == OriginValues.Count / PAIRCOUNT)
{
result.Add(temp);
return;
}
for (int x = 0; x < PAIRCOUNT; x++)
{
temp.Add(OriginValues[itemset.Count * PAIRCOUNT + x]);
Recurse(OriginValues, ref result, temp);
temp = new List<KeyValuePair<char, int>>(itemset);
}
}
这篇关于C#高级置换方案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!