如何获得弗洛伊德三角形中的相邻块?
How to get the adjacent blocks in Floyd triangle?
我需要编写一个函数来查找 Floyd 三角形中的相邻块。
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55
查找给定值的相邻块(顶部、左侧、右侧、底部)的公式是什么。
例如:
- 输入20→输出左:19,右:21,上:15,下:26
- 输入28→输出左:27,右:-1,上:-1,下:35
- 输入19→输出左:18,右:20,上:14,下:25
在此先感谢您!
上行或下行所需的班次由行的标识符唯一确定。如果在给定的值中 n >= 1
,你必须找到最大的整数 k
使得:
k(k+1)/2 + 1 <= n <=> k^2 + k + 2(1 - n) <= 0
这是一个二阶多项式函数:
delta = 1 - 8(1 - n) = 8n - 7 > 0
x1 = (-1 + sqrt(8n-7)) / 2 and x2 = (-1 - sqrt(8n-7)) / 2
x2 < 0 < x1
因此该行的基于 0 的标识符为:k := floor((-1 + sqrt(8n-7)) / 2)
.
之后:向上 n - k
,向下 n + k + 1
,向左 n - 1
,向右 n + 1
。角落案例 (leftmost/rightmost/...) 也可以用 k
发现,留给 reader。 ;)
我需要编写一个函数来查找 Floyd 三角形中的相邻块。
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55
查找给定值的相邻块(顶部、左侧、右侧、底部)的公式是什么。
例如:
- 输入20→输出左:19,右:21,上:15,下:26
- 输入28→输出左:27,右:-1,上:-1,下:35
- 输入19→输出左:18,右:20,上:14,下:25
在此先感谢您!
上行或下行所需的班次由行的标识符唯一确定。如果在给定的值中 n >= 1
,你必须找到最大的整数 k
使得:
k(k+1)/2 + 1 <= n <=> k^2 + k + 2(1 - n) <= 0
这是一个二阶多项式函数:
delta = 1 - 8(1 - n) = 8n - 7 > 0
x1 = (-1 + sqrt(8n-7)) / 2 and x2 = (-1 - sqrt(8n-7)) / 2
x2 < 0 < x1
因此该行的基于 0 的标识符为:k := floor((-1 + sqrt(8n-7)) / 2)
.
之后:向上 n - k
,向下 n + k + 1
,向左 n - 1
,向右 n + 1
。角落案例 (leftmost/rightmost/...) 也可以用 k
发现,留给 reader。 ;)