2016-09-13 71 views
-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

非常感謝你提前!

+1

你從[你關於主題的上一個問題](http://stackoverflow.com/q/39467778/2336725)學到了什麼? – Teepeemm

回答

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,留給讀者。 ;)

+0

你如何用遞歸而不是sqrt來解決它? – bbnn

+0

@beeant:每個算法都可以「人工」遞歸,但是我不得不說我在這裏沒有看到任何自然的遞歸子結構...爲什麼你想要使用遞歸? – md5

+0

,因爲我試圖不使用數學函數。 – bbnn

相關問題