- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 n*n 螺旋矩阵。
if N = 4
then matrix :
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13if N = 3
7 8 9
6 1 2
5 4 3
我想得到这个螺旋矩阵的对角线值。
在 n=4
的情况下,对角线值为 7,1,3,13,10,2,4,16
我可以通过将这个矩阵存储在数组中并遍历每个对角线值来做到这一点。
有没有更好的方法来获取这些值。
最佳答案
为了得到主对角线上的数字,我们可以注意到这些值是
1 = 1
1 + 2 = 3
1 + 2 + 4 = 7
1 + 2 + 4 + 6 = 13
所以一般公式是 1 + (sum i = 0 to k of 2*i) for k = 0, 1, 2, ...对此进行简化,对于 k = 0, 1, 2, ...,我们得到 k^2 + k + 1
在 PHP 中,我们可以通过这样的方式生成这些:
function mainDiagonal($n) {
$values = array();
for ($k = 0; $k < $n; $k++) {
$values[] = $k*$k + $k + 1;
}
return $values;
}
为了得到偶数 N 的反对角线上的数字,我们看到:
2 = 2
2 + 2 = 4
2 + 2 + 6 = 10
2 + 2 + 6 + 6 = 16
如果我们对更大的矩阵继续这种模式,我们会看到一般公式是
将 i = 0 到 k of floor(i/2)*4 + 2 求和,对于 k = 0, 1, 2, ...
同样对于奇数 N 我们发现公式是
1 + (sum i = 0 to k of ceil(i/2)*4) for 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;
}
注意k的最大值比矩阵的维数小一。
结合这些函数,我们得到:
array_unique(array_merge(mainDiagonal($n), antiDiagonal($n)))
关于php - 获取螺旋矩阵的对角线值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37949870/
我正在尝试创建一个结构,如下面的屏幕截图所示。有没有办法在 JavaScript 中为此构建一个算法,以按时间顺序获取每个红点的 X 和 Y 坐标,以根据特定数量生成无限螺旋? Screenshot
我在 C++ 中有如下代码: for(int x = position.x; x GetValue(tc); } } 它的作用是生成一个梯度噪声值容器。在这样做的同时,它还会使结果围绕震中螺旋
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是一名优秀的程序员,十分优秀!