根据特定条件填充矩阵

时间:2012-12-17 15:20:21

标签: algorithm matrix pseudocode

问题是什么算法可以找到填充大小为N * M

的矩阵的可能性

将包括从1到N * M的所有数字,其方式是从左到右,从上到下排序

例如:

对于N = 2,M = 3 金额是4

  1. 1 2 3

    4 5 6

  2. 1 3 5

    2 4 6

  3. 1 2 5

    3 4 6

  4. 1 2 4

    3 5 6

  5. 我试图找出某种模式,但没有成功,这是作业, 我所意识到的是,在所有情况下,N * M中的最大数字必须在[N] [M]中,而最低数字必须在[0] [0]中,帮助将非常感激

1 个答案:

答案 0 :(得分:2)

你忘了:

1 3 4
2 5 6

c#中的代码:

    static int N = 5;
    static int M = 5;
    static int[,] Number;
    static int[] NumbersInRow;


    static int Put(int n)
    {
        if (n > N * M)
        {
            // If output of each solution is desired
            //for (int y = 0; y < N; y++)
            //{
            //    for (int x = 0; x < M; x++)
            //        Console.Write(Number[y, x] + "\t");

            //    Console.WriteLine();
            //}
            //Console.WriteLine();
            return 1;
        }

        int sum = 0;

        int numbersInLastRow = int.MaxValue;
        int currentRow = 0;
        while (currentRow < N)
        {
            int numbersInCurrentRow = NumbersInRow[currentRow];
            if (numbersInCurrentRow < numbersInLastRow && numbersInCurrentRow < M)
            {
                Number[currentRow, NumbersInRow[currentRow]] = n;
                NumbersInRow[currentRow]++;
                sum += Put(n + 1);
                NumbersInRow[currentRow]--;
                Number[currentRow, NumbersInRow[currentRow]] = 0;
            }
            numbersInLastRow = NumbersInRow[currentRow];
            currentRow++;
        }

        return sum;
    }

    static void Main(string[] args)
    {
        Number = new int[N, M];
        NumbersInRow = new int[N];
        Console.WriteLine(Put(1));
        Console.ReadLine();
    }

<强>解释

按顺序在电路板上放置数字,从1开始。当一个数字有多个正确的位置时,递归分割并计算所有解决方案。

如果不尝试每个可能的展示位置/使用回溯,我们如何知道数字的正确展示位置? 一个数字可以放在任何非完整行的第一个空位置,其前一行中有更多数字,假设&#34; -1th&#34;行中有无数个数字。那就是它。这样我们就不会做出错误的举动。

请注意,这是对称的 - 就像您可以随时将下一个数字放入第一行(如果它不满),您也可以将它放入第一列。

解决方案的数量增长非常快:

2x2 - 2
3x3 - 42
4x4 - 24024
5x5 - 701149020