C#。在(n x n)表

时间:2017-04-06 07:43:25

标签: c# dynamic-programming indexoutofrangeexception

我遇到代码问题,我得

  

System.IndexOutOfRangeException

find()方法的第一个循环中。你们能帮助我吗?我不知道什么是错的。

我已经找到了java的这段代码,并为C#改了一点。在java代码中有int[][] A,我已将其更改为int[,]。 P.S on java,代码可以工作。

class Program
{
    static void Main(string[] args)
    {
        int[,] A = { { 1, 7, 9, 2 }, { 8, 6, 3, 2 }, { 1, 6, 7, 8 },
            { 2, 9, 8, 2 } };
        Console.WriteLine("{0}", find(A));
    }

    public static int find(int[,] A)
    {
        int[,] solution = new int[A.Length + 1, A.Length + 1];

        solution[0, 0] = A[0, 0];

        for(int i = 1; i < A.Length; i++)
        {
            solution[0, i] = A[0, i] + solution[0, i - 1]; //IndexOutOfRangeException
        }

        for(int i = 1; i < A.Length; i++)
        {
            solution[i, 0] = A[i, 0] + solution[i - 1, 0];
        }

        for(int i = 1; i < A.Length; i++)
        {
            for(int j = 1; j < A.Length; j++)
            {
                solution[i, j] = A[i, j] 
                    + Math.Min(solution[i - 1, j], solution[i, j - 1]);
            }
        }
        return solution[A.Length - 1, A.Length - 1];
    }
}

1 个答案:

答案 0 :(得分:2)

问题在于,在锯齿状数组([,])中,属性Length将为您提供总体数量的元素,在您的情况下为A.Length == 16,但您只需要一个维度。解决方案是使用GetLength

for (int i = 1; i < A.GetLength(1); i++)

您需要将0用于X维度,并使用1作为Y维度([X,Y])有关详细信息,请参阅documenation。< / p>

这就是你的方法应该是这样的:

public static int find(int[,] A)
{
    int[,] solution = new int[A.GetLength(0) + 1, A.GetLength(1)+ 1];

    solution[0, 0] = A[0, 0];

    for (int i = 1; i < A.GetLength(1); i++)
    {
        solution[0, i] = A[0, i] + solution[0, i - 1];
    }

    for (int i = 1; i < A.GetLength(0); i++)
    {
        solution[i, 0] = A[i, 0] + solution[i - 1, 0];
    }

    for (int i = 1; i < A.GetLength(0); i++)
    {
        for (int j = 1; j < A.GetLength(1); j++)
        {
            solution[i, j] = A[i, j]
                + Math.Min(solution[i - 1, j], solution[i, j - 1]);
        }
    }
    return solution[A.GetLength(0) - 1, A.GetLength(1) - 1];
}