квадратная головоломка c # - PullRequest
0 голосов
/ 27 мая 2011

Не могли бы вы помочь мне и исправить мой код

    static void SolveAndDraw(int number)
    {

        // Create Dynamic List of list to 

        List<List<int>> matrix = new List<List<int>>();

        // Intialize the inner lists 
        for (int j = 0; j < number; j++)
        {
            matrix.Add(new List<int>());


        }

        char direction = 'r';
        int xPos = 0, yPos = 0;
        int rightLimit = number - 1;
        int leftLimit = 0;
        int upLimit = 0;
        int bottomLimit = number - 1;

        for (int i = 1; i <= number * number; ++i)
        {

           // matrix[yPos][xPos] = i;

            matrix[xPos].Insert(yPos, i);
            switch (direction)
            {
                case 'r':
                    if (xPos < rightLimit)
                    {
                        ++xPos;
                    }
                    else
                    {
                        direction = 'd';
                        ++upLimit;
                        ++yPos;
                    }
                    break;


                case 'l':
                    if (xPos > leftLimit)
                    {
                        --xPos;
                    }
                    else
                    {
                        direction = 'u';
                        --bottomLimit;
                        --yPos;
                    }
                    break;

                case 'u':
                    if (yPos > upLimit)
                    {
                        --yPos;
                    }
                    else
                    {
                        direction = 'r';
                        ++leftLimit;
                        ++xPos;
                    }
                    break;

                case 'd':
                    if (yPos < bottomLimit)
                    {
                        ++yPos;
                    }
                    else
                    {
                        direction = 'l';
                        --rightLimit;
                        --xPos;
                    }
                    break;
            }
        }

        // Now, just dump the matrix contents to stdout
        for (int i = 0; i < number; ++i)
        {
            for (int j = 0; j < number; ++j)
            {
                Console.Write("{0}\t", matrix[i][j]);
            }
            Console.Write("\n");

        }

        Console.ReadLine();

    }

Он вылетает и выдает ошибку:

Индекс должен находиться в пределах списка.

Имя параметра: индекс

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Требуется ли этот список списков, или вы можете использовать массив с 2 измерениями (вы передаете измерение через число, зачем вам списки?)

static void SolveAndDraw(int number)
        {

            // Create array with two dimensions of size number
            int[,] matrix = new int[number,number];            

            char direction = 'r';
            int xPos = 0, yPos = 0;
            int rightLimit = number - 1;
            int leftLimit = 0;
            int upLimit = 0;
            int bottomLimit = number - 1;

            for (int i = 1; i <= number * number; ++i)
            {
                matrix[xPos,yPos] = i;
                switch (direction)
                {
                    case 'r':
                        if (xPos < rightLimit)
                        {
                            ++xPos;
                        }
                        else
                        {
                            direction = 'd';
                            ++upLimit;
                            ++yPos;
                        }
                        break;


                    case 'l':
                        if (xPos > leftLimit)
                        {
                            --xPos;
                        }
                        else
                        {
                            direction = 'u';
                            --bottomLimit;
                            --yPos;
                        }
                        break;

                    case 'u':
                        if (yPos > upLimit)
                        {
                            --yPos;
                        }
                        else
                        {
                            direction = 'r';
                            ++leftLimit;
                            ++xPos;
                        }
                        break;

                    case 'd':
                        if (yPos < bottomLimit)
                        {
                            ++yPos;
                        }
                        else
                        {
                            direction = 'l';
                            --rightLimit;
                            --xPos;
                        }
                        break;
                }
            }

            // Now, just dump the matrix contents to stdout
            for (int i = 0; i < number; ++i)
            {
                for (int j = 0; j < number; ++j)
                {
                    Console.Write("{0}\t", matrix[i,j]);
                }
                Console.Write("\n");

            }

            Console.ReadLine();

        }

    }
1 голос
/ 27 мая 2011

Это исключение выдается, если вы пытаетесь вставить () по индексу, который больше текущего счетчика списка. Скорее всего, вы пересекаете «матрицу» таким образом, что утверждение

matrix[xPos].Insert(yPos, i);

вставляет в список, который еще не имеет размер yPos. Самый простой способ избежать этого - изначально добавить достаточное количество элементов в каждый внутренний список:

    // Intialize the inner lists 
    for (int j = 0; j < number; j++)
    {
        matrix.Add(new List<int>());

        // New code here:
        for (int k = 0; k < number; k++)
            matrix[j].Add(0);
    }
0 голосов
/ 27 мая 2011

Не запуская код в моей голове, эта строка

for (int i = 1; i <= number * number; ++i)

выглядит подозрительно, может быть, вам стоит начать с 0, но опять же, я могу быть полностью отключен.

...