-1

我需要编写一个函数来查找弗洛伊德三角形中的相邻块。

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

非常感谢您!

4

1 回答 1

2

上升或下降所需的班次由线路的标识符唯一确定。如果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。角落案例(最左边/最右边/...)也可以被发现k,留给读者。;)

于 2016-09-13T11:49:18.213 回答