5

番号付きの円があるとします。ポイントAからポイントBに行きたいのですが、左に行くべきか右に行くべきかわかりません。数字を使って、どの方向に進むべきかをどのように計算しますか?

例:

現在1です。5に進みたいと思います。5が近いので右に行くのが見えます。また、あなたは常に内側を向いていることに注意してください。

img

4

6 に答える 6

2
If B > A
  If B - A > max/2, head CCW, else CW
Else
  If A - B > max/2, head CW, else CCW

つまり、ラップアラウンドポイント(6から1)を越えていない場合は、半分以上進んでいる場合は、ラップアラウンドポイントを越えてください。

于 2012-02-08T21:46:58.360 に答える
2

まず、実行するすべての計算が6を法とする(またはn)ことを確認します。つまり、-2 modulo 6 = 4を意味します。次に、時計回りに1回、反時計回りに1回計算できます。時計回りのトリップはBA、反時計回りのABです。次に、これら2つの結果を比較すると、低い方が優先されます。

例:

A = 1、B = 5

時計回りに移動:BA = 4
カウンターcw移動:AB = -4 = 2

例2:

A = 5、B = 1

時計回りに移動:BA = 2
カウンターcw移動:AB = 4

于 2012-02-08T21:55:09.903 に答える
1

これが真理値表を使った私の解決策です(正しくチェックするためだけに)。ABSは絶対値を求めています。

a,b | x1 = abs(b-a) < max/2 | x2 = b-a > 0 | x1 == x2 
2,3 | true                  | true         | true
1,6 | false                 | true         | false
6,1 | false                 | false        | true
5,4 | true                  | false        | false

時計回りに回す=(x1 = abs(ba)<max / 2)==(x2 = ba> 0)

于 2012-02-08T22:25:06.127 に答える
1

私はあなたのために2つの再帰的で単純なscalaソリューションを持っています。基本的な考え方は、道は半ラウンドを超えてはならないということです。これは、私たちの場合はたまたま3ですが、もちろんパラメーター化することもできます。

def fromAtoBClockwise (a: Int, b: Int) : Boolean = { 
  if (a > b) ! fromAtoBClockwise (b, a)
  else b - a  <= 3 }

距離は3を超えてはなりませんが、1〜5を引くことを避けるために、a> bの場合、パラメーターを回転させて結果を反転します。

def fromAtoBClockwise (a: Int, b: Int) : Boolean = { 
  if (a > b) fromAtoBClockwise (a, b + 6)
  else b - a  <= 3 } 

別の方法は、円のサイズが小さい場合は、bに6を追加することです。

両方とも機能しますが、両方の方法の長さが等しい場合、結果が異なる場合があります。

サイズのパラメーターと奇数サイズを使用すると、両方で同じ結果が得られます。

def fromAtoBClockwise (a: Int, b: Int, size: Int) : Boolean = { 
  if (a > b) ! fromAtoBClockwise (b, a, size)
  else b - a  <= size/2 } 


def fromAtoBClockwise (a: Int, b: Int, size: Int) : Boolean = { 
  if (a > b) fromAtoBClockwise (a, b + size, size)
  else b - a  <= size/2 } 

テスト(出力凝縮):

(1 to 5).map (a => (1 to 5).map (b => { if (a != b) println (a + " " + b + " " + fromAtoBClockwise (a, b, 5))}))

1 2 true    1 3 true    1 4 false   1 5 false
2 1 false   2 3 true    2 4 true    2 5 false
3 1 false   3 2 false   3 4 true    3 5 true
4 1 true    4 2 false   4 3 false   4 5 true
5 1 true    5 2 true    5 3 false   5 4 false
于 2012-02-09T02:10:19.840 に答える
0

a==最初の点、およびb==2番目の点を考慮する

pointAtoPointB = 0

for a to b
  pointAtoPointB ++

pointBtoPointA = 0

for b to a
  pointBtoPointA ++

if pointBtoPointA > pointAtoPointB
  go a to b
else
  go b to a 
于 2012-02-08T21:41:00.033 に答える
-1
clockWise = B - A <  A + MAX - B

B> Aの場合、それに応じてポジションを交換します。

于 2012-02-08T21:40:43.247 に答える