我有带K群的MxN矩阵。组是一组列。如何生成一个组的列与另一个组的列的组合?
例如,2x4矩阵,组大小-2列(1,2 -第一,3,4 -秒)
我得到了组合
1-3
1-4
2-3
2-4
在这种情况下,我可以使用多个循环。
for (int i = 0; i < 2; i++)
for (int j = 2; j < 4; j++)
Console.WriteLine("{0} - {1}", i, j);
3组和2x6矩阵的情况如何?
for (int i = 0; i < 2; i++)
for (int j = 2; j < 4 ; j++)
for (int k = 4; k < 6; k++)
Console.WriteLine("{0} - {1} - {2}", i, j, k);
其他案子怎么样?如何组织循环/递归?
发布于 2016-06-13 20:30:40
对于这个问题中的边情况和行的作用不确定,但是对于简单的情况,您提供的这种方法会起作用:
static void Main()
{
var columns = 6;
var groupSize = 2;
var groups = GetGroups(columns, groupSize).ToArray();
var groupCurrentIndex = Enumerable.Range(0, groups.Length).ToDictionary(i => i, i => 0);
var maxIndex = groupSize - 1;
while (true)
{
var combination = groups.Select((g, i) => g[groupCurrentIndex[i]]);
PrintCombination(combination);
var incrementedGroupIndex = false;
for (var i = groups.Length - 1; i > 0; i--)
{
if (groupCurrentIndex[i] != maxIndex)
{
groupCurrentIndex[i]++;
incrementedGroupIndex = true;
break;
}
if (groupCurrentIndex[i] == maxIndex && groupCurrentIndex[i - 1] != maxIndex)
{
groupCurrentIndex[i-1]++;
incrementedGroupIndex = true;
for (var j = i; j < groups.Length; j++)
{
groupCurrentIndex[j] = 0;
}
break;
}
}
if (!incrementedGroupIndex)
{
break;
}
}
Console.ReadLine();
}
private static IEnumerable<int[]> GetGroups(int columns, int groupSize)
{
for (var startIndex = 0; startIndex < columns; startIndex = startIndex + groupSize)
{
yield return Enumerable.Range(startIndex, groupSize).ToArray();
}
}
private static void PrintCombination(IEnumerable<int> combination)
{
Console.WriteLine(string.Join(" - ", combination));
}
https://stackoverflow.com/questions/37796717
复制相似问题