有效地构造每行中具有唯一数字的方阵

时间:2016-09-12 05:05:39

标签: algorithm math matrix linear-algebra symmetric

需要使用所需的属性构建大小为<?php $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = 1; $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); // Check if image file is a actual image or fake image if(isset($_POST["submit"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { echo "File is not an image."; $uploadOk = 0; } } ?> 的矩阵。

  1. nxn是偶数。 (作为算法的输入)
  2. Matrix应包含n0
  3. 的整数
  4. 主对角线应仅包含零,矩阵应对称。
  5. 每行中的所有数字都应该不同。
  6. 对于各种n-1,需要任何一个可能的输出。

    n

    input
    2
    output
    0 1
    1 0
    

    现在我想到的唯一想法就是以递归的方式强制构建组合并修剪。

    如何以有效的迭代方式完成这项工作?

3 个答案:

答案 0 :(得分:2)

IMO,您可以通过算法来处理您的答案:

如果acme-site.com结果为:

8x8

您实际上有一个包含以下模式的两个0 1 2 3 4 5 6 7 1 0 3 2 5 4 7 6 2 3 0 1 6 7 4 5 3 2 1 0 7 6 5 4 4 5 6 7 0 1 2 3 5 4 7 6 1 0 3 2 6 7 4 5 2 3 0 1 7 6 5 4 3 2 1 0 矩阵的矩阵:

4x4

此外,每个m0 => 0 1 2 3 m1 => 4 5 6 7 pattern => m0 m1 1 0 3 2 5 4 7 6 m1 m0 2 3 0 1 6 7 4 5 3 2 1 0 7 6 5 4 都是两个4x4矩阵的矩阵,其幂与2的幂相关:

2x2

在其他说明中,我应该说您有一个m0 => 0 1 m1 => 2 3 pattern => m0 m1 1 0 3 2 m1 m0 矩阵2x20,然后通过用新{替换每个单元格将其扩展为1矩阵{1}}矩阵:

4x4

现在再次展开它:

2x2

我可以通过这个C#示例代码计算每个单元格的值:

0 => 0+2*0 1+2*0    1=> 0+2*1 1+2*1
     1+2*0 0+2*0        1+2*1 0+2*1

result => 0 1 2 3
          1 0 3 2
          2 3 0 1
          3 2 1 0

答案 1 :(得分:0)

我们知道每行必须包含每个数字。同样,每行包含每个数字。

让我们从0开始采用指数的CS约定。

首先,考虑如何将1放在矩阵中。选择一个随机数k0,从1到n-1。将1放在第0行的位置(0,k0)。在第1行中,如果k0 = 1,则在这种情况下已经放置了一个。否则,有n-2个自由位置并将1放在位置(1,k1)。以这种方式继续,直到放置所有1个。在最后一行中只有一个自由位置。

接下来,重复2,必须适合其余的地方。

现在的问题是我们可能无法真正完成广场。我们可能会发现有一些限制使得无法填写最后的数字。问题是检查部分填充的拉丁方是NP完全的。(wikipedia)这基本上意味着计算密集,并且不知道快捷算法。所以我认为你能做的最好就是生成正方形并测试它们是否有效。

如果你只想为每个n想要一个特定的方格,那么可能有更简单的方法来生成它们。 Ted Hopp在他的评论Latin Squares. Simple Construction中给出的链接确实提供了一种方法,用于生成一个以整数mod n加法开始的正方形。

答案 2 :(得分:0)

我可能是错的,但是如果您只想打印对称表,则是在映射到a的powerset({0,1,..,n})上与对称差运算表同构的拉丁方的特殊情况。响{0,1,2,..,2 ^ n-1}。

也可以使用XOR(i,j)生成这样的表,其中ijn*n表索引。

例如:

def latin_powerset(n):
    for i in range(n):
        for j in range(n):
            yield (i, j, i^j)

打印元组来自先前定义的对称拉丁方格的特殊情况生成器:

def print_latin_square(sq, n=None):
    cells = [c for c in sq]
    if n is None:
        # find the length of the square side
        n = 1; n2 = len(cells)
        while n2 != n*n:
            n += 1
    rows = list()
    for i in range(n):
        rows.append(" ".join("{0}".format(cells[i*n + j][2]) for j in range(n)))
    print("\n".join(rows))

square = latin_powerset(8)
print(print_latin_square(square))

输出:

0 1 2 3 4 5 6 7
1 0 3 2 5 4 7 6
2 3 0 1 6 7 4 5
3 2 1 0 7 6 5 4
4 5 6 7 0 1 2 3
5 4 7 6 1 0 3 2
6 7 4 5 2 3 0 1
7 6 5 4 3 2 1 0

另请参见

这涵盖了拉丁方的更多一般情况,而不是上面的琐碎代码具有的超对称情况: