方形拼图c#

时间:2011-05-26 21:54:37

标签: c# c#-2.0

你可以帮助我并纠正我的代码

    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();

    }

崩溃并发出错误:

  

索引必须在List的范围内。

     

参数名称:index

3 个答案:

答案 0 :(得分:2)

是否需要列表列表,或者您可以使用具有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 :(得分:1)

如果您尝试在大于当前列表计数的索引处插入(),则抛出该异常。很可能你正在遍历&#34;矩阵&#34;以这种方式声明

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);
    }

答案 2 :(得分:0)

没有在我脑海中运行代码,这一行

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

看起来很可疑,可能你应该从0开始,但话说再说一次,我可能完全不在了。