获得螺旋矩阵的对角线值

Aja*_*jay 6 php algorithm math

我有一个*n螺旋矩阵.

如果N = 4

矩阵:

 7  8  9 10   
 6  1  2 11  
 5  4  3 12   
16 15 14 13
Run Code Online (Sandbox Code Playgroud)

如果N = 3

 7 8 9
 6 1 2
 5 4 3 
Run Code Online (Sandbox Code Playgroud)

我想得到这个螺旋矩阵的对角线值.

n=4对角线值为7,1,3,13,10,2,4,16 的情况下

我可以通过将此矩阵存储在数组中并遍历每个对角线值来实现此目的.
有没有更好的方法来获得这些价值观.

Wil*_*kel 2

为了获得主对角线上的数字,我们可以注意到这些值是

1 = 1
1 + 2 = 3
1 + 2 + 4 = 7
1 + 2 + 4 + 6 = 13
Run Code Online (Sandbox Code Playgroud)

因此,一般公式为 1 + (sum i = 0 to k of 2*i) for k = 0, 1, 2, ... 简化这个,我们得到 k^2 + k + 1 for k = 0, 1, 2、...

在 PHP 中,我们可以通过如下方式生成这些:

function mainDiagonal($n) {
    $values = array();

    for ($k = 0; $k < $n; $k++) {
        $values[] = $k*$k + $k + 1;
    }

    return $values;
}
Run Code Online (Sandbox Code Playgroud)

为了获得偶数 N 的反对角线上的数字,我们可以看到:

2 = 2
2 + 2 = 4
2 + 2 + 6 = 10
2 + 2 + 6 + 6 = 16
Run Code Online (Sandbox Code Playgroud)

如果我们对更大的矩阵继续这种模式,我们会看到一般公式是

总和 i = 0 到 k 的楼层(i/2)*4 + 2,其中 k = 0, 1, 2, ...

类似地,对于奇数 N,我们发现公式为

1 +(ceil(i/2)*4 的 i = 0 到 k 之和),其中 k = 0, 1, 2, ...

在 PHP 中,我们可以通过如下方式生成这些:

function antiDiagonal($n) {
    $values = array();

    if ($n % 2 == 0) {
        for ($k = 0; $k < $n; $k++) {
            $accum = 0;

            for ($j = 0; $j <= $k; $j++) {
                $accum += floor($j/2)*4 + 2;
            }

            $values[] = $accum;
        }
    } else {
        for ($k = 0; $k < $n; $k++) {
            $accum = 1;

            for ($j = 0; $j <= $k; $j++) {
                $accum += ceil($j/2)*4;
            }

            $values[] = $accum;
        }
    }

    return $values;
}
Run Code Online (Sandbox Code Playgroud)

请注意,k 的最大值比矩阵的维度小一。

结合这些函数,我们得到:

array_unique(array_merge(mainDiagonal($n), antiDiagonal($n)))
Run Code Online (Sandbox Code Playgroud)

  • 很好,那么添加 `print_r(array_unique(array_merge(mainDiagonal($n),antiDiagonal($n))));` 怎么样? (2认同)