如何循环(n×12)2D数组

时间:2016-03-23 20:14:56

标签: c# arrays recursion

我有一个二维数组(维度大小为n乘以5),我在脑海中想象的是这样(每个框都是数组的一个元素):

http://tr1.cbsistatic.com/hub/i/2015/05/07/b1ff8c33-f492-11e4-940f-14feb5cc3d2a/12039.jpg

在此图像中,n为3.即,n为列数,5为数组中的行数。

我想找到一种有效的方法来迭代(即遍历)从最左边的列中的任何单元格到最右边列中的任何单元格的每条路径,从中间的每一列中选择一个单元格。

n嵌套循环无法简单解决,因为n仅在运行时确定。

我认为这意味着递归可能是最好的前进方式,但无法理解如何从理论上开始。

您能否提供一些关于如何在每条路径中循环的建议。这看起来很简单,我无法说出我做错了什么。即使只是一个没有任何代码的理论解释,我们将非常感激。

我在C#,Visual Studio中进行编码以防万一。

UPDATE ::使用以下http://www.introprogramming.info/english-intro-csharp-book/read-online/chapter-10-recursion/#_Toc362296468

中的代码解析
static void NestedLoops(int currentLoop)
{
if (currentLoop == numberOfLoops)
{
    return;
}

for (int counter=1; counter<=numberOfIterations; counter++)
{
    loops[currentLoop] = counter;
    NestedLoops(currentLoop + 1);
}
}

2 个答案:

答案 0 :(得分:0)

这是一个因素问题,因此您可能会很快进入内存或值限制问题。

迭戈从this SO post获取了一些代码。

class Program
{
    static void Main(string[] args)
    {
        int n = 5;
        int r = 5;
        var combinations = Math.Pow(r, n);
        var list = new List<string>();
        for (Int64 i = 1; i < combinations; i++)
        {
            var s = LongToBase(i);
            var fill = n - s.Length;
            list.Add(new String('0', fill) + s);
        }

        // list contains all your paths now

        Console.ReadKey();
    }

    private static readonly char[] BaseChars = "01234".ToCharArray();
    public static string LongToBase(long value)
    {
        long targetBase = BaseChars.Length;
        char[] buffer = new char[Math.Max((int)Math.Ceiling(Math.Log(value + 1, targetBase)), 1)];
        var i = (long)buffer.Length;
        do
        {
            buffer[--i] = BaseChars[value % targetBase];
            value = value / targetBase;
        }
        while (value > 0);
        return new string(buffer);
    }
}

列表将包含以base 5表示的数字列表,可用于找出路径。例如,“00123”表示第一个单元格,然后是第一个单元格,然后是第二个单元格,然后是第三个单元格,则表示第四个单元格。

答案 1 :(得分:0)

已解决::查看上面编辑过的问题中发布的代码,以及指向递归教程的链接,在此指导您使用递归来模拟N个嵌套的迭代循环。