2016-09-13 10 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 на основе идентификатором line: k := floor((-1 + sqrt(8n-7))/2).

После этого: вверх n - k, вниз n + k + 1, слева n - 1 и справа n + 1. Угловые шкафы (крайняя левая/правая/правая) могут быть замечены также k, оставленные читателю. ;)

+0

как вы решаете его с рекурсией вместо sqrt? – bbnn

+0

@beeant: каждый алгоритм может быть сделан «искусственно» рекурсивным, но я должен сказать, что я не вижу здесь никакой естественной рекурсивной подструктуры ... Почему вы хотите использовать рекурсию? – md5

+0

, потому что я пытаюсь не использовать функцию Math. – bbnn