我是编程和JAVA的新手。我已经创建了一个简单的JAVA代码,用于生成S置换矩阵。 S-置换矩阵是方形矩阵,每行中有1个,每列和每个块恰好一次,例如
1 0 0 * 0 0 0 * 0 0 0
0 0 0 * 1 0 0 * 0 0 0
0 0 0 * 0 0 0 * 1 0 0
***********************
0 1 0 * 0 0 0 * 0 0 0
0 0 0 * 0 1 0 * 0 0 0
0 0 0 * 0 0 0 * 0 1 0
***********************
0 0 1 * 0 0 0 * 0 0 0
0 0 0 * 0 0 1 * 0 0 0
0 0 0 * 0 0 0 * 0 0 1
以上是9 X 9 S置换矩阵的示例。
4 x 4例子是
1 0 * 0 0
0 0 * 1 0
***********
0 1 * 0 0
0 0 * 0 1
我为 4 X 4 制作了一个Java代码,它生成了所有4个X 4 S置换矩阵,其数量为16。但是当我为9 X 9做同样的逻辑时,程序会给出一些矩阵,然后显示 stackoverflow错误。
这些9 X 9 S置换矩阵的数量为46656。该程序提供了大约2000个矩阵,然后显示stackoverflow错误。我问了一些朋友并在google上搜索并认为程序的逻辑是错误的,或者是因为在程序中大量使用递归。
请有人帮我解决这个问题并告诉我如何最大限度地减少递归的使用。我在某些网站上看到,一种方法是使用循环但是没有办法使用循环。请告诉我还有其他办法吗?
我要分享的节目是我制作的第二个节目,它只提供了大约300个矩阵.. http://pastebin.com/2LBCCcE9
答案 0 :(得分:1)
我认为您应该采用不同的方式来表示矩阵。
例如,不是实际创建数组列表的数组列表,而是尝试用数字表示行。您知道每行只有一列是" 1",其余的都是零。不要将这样的行表示为数组列表,只需使用1:
列的索引1 0 0 0 0 0 0 0 0 → 0
0 1 0 0 0 0 0 0 0 → 1
0 0 1 0 0 0 0 0 0 → 2
0 0 0 1 0 0 0 0 0 → 3
0 0 0 0 1 0 0 0 0 → 4
0 0 0 0 0 1 0 0 0 → 5
0 0 0 0 0 0 1 0 0 → 6
0 0 0 0 0 0 0 1 0 → 7
0 0 0 0 0 0 0 0 1 → 8
现在,任何法律矩阵都是这些数字的排列,例如,
1 0 2 4 5 8 6 7 3
是矩阵的表示
0 1 0 0 0 0 0 0 0 → 1
1 0 0 0 0 0 0 0 0 → 0
0 0 1 0 0 0 0 0 0 → 2
0 0 0 0 1 0 0 0 0 → 4
0 0 0 0 0 1 0 0 0 → 5
0 0 0 0 0 0 0 0 1 → 8
0 0 0 0 0 0 1 0 0 → 6
0 0 0 0 0 0 0 1 0 → 7
0 0 0 1 0 0 0 0 0 → 3
因此,9个整数的简单数组现在可以表示整个矩阵。并且这个矩阵保证满足行和列唯一性的约束(你明白为什么吗?)
所以你现在所做的就是尝试生成这九个数字的所有排列 - 这是一个更容易解决的问题。
编写一个接受这种置换作为参数的方法,并检查它是否也满足块上的约束。
private boolean checkBlocks( int[] matrix, int blockWidth ) {
// Your code for checking here
}
在此方法中,您可以将矩阵重建为数组或任何有助于检查约束的数组,并检查它,如果块正常则返回true,否则返回false。
现在,您所要做的就是生成数组的所有排列[0 1 2 3 4 5 6 7 8 9],将它们中的每一个传递给checkBlocks
方法,并且只保留返回的那些真。
9个数字的排列的递归不超过9个,对于这样的小数组,我确定你没有Stack Overflow的问题。