-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

これは 2 次多項式関数です。

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 に答える