问题是什么算法可以找到填充大小为N * M
的矩阵的可能性将包括从1到N * M的所有数字,其方式是从左到右,从上到下排序
例如:
对于N = 2,M = 3 金额是4
1 2 3
4 5 6
1 3 5
2 4 6
1 2 5
3 4 6
1 2 4
3 5 6
我试图找出某种模式,但没有成功,这是作业, 我所意识到的是,在所有情况下,N * M中的最大数字必须在[N] [M]中,而最低数字必须在[0] [0]中,帮助将非常感激
答案 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