2012-02-08 8 views
5

番号のついた円があるとします。私たちはA地点からB地点に行きたいと思っていますが、左か右に行くべきかはわかりません。どのようにあなたは、数字を使って、あなたが行くべき方向を計算しますか?シンプルで短い論理アルゴリズム(どちらの方向に向いていますか)

例:私たちは現在、1に我々は5に行きたいされている

私は5が近いので、我々は右に行くされていることをvissualy見ることができます。また、常に内側に向かっていることに注意してください。 B> A、スワップ位置に

img

+0

は常に番号順になっている:

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 } 

テスト(出力が凝縮):サイズのパラメータ、および奇数サイズで

は、あなたはどちらも同じ結果を得ますか?視界の "範囲"は何ですか? – Nicholas

+0

はい、数字は常に順番に並んでいて、すべての数字を「見る」(知っています)。 –

+2

モジュール式(ベースn)減算​​を実行し、n/2にしきい値を使用します。 – ElKamina

答えて

2

まず、すべての計算が法6(またはn)であることを確認します。これは、-2を法とする6 = 4を意味します。時計回りに1回、時計回りに1回計算できます。時計回りのトリップはB-A、反時計回りA-Bです。その2つの結果を比較すると、低い方が勝ちます。

例:

A = 1、B = 5

時計ムーブ:BA = 4
カウンタCW移動:AB = -4 = 2

例2:

A = 5、B = 1

時計回り移動:BA = 2
counter cw move:A -B = 4

+0

シンプルでクイックで優れた!ありがとう –

-1
clockWise = B - A < A + MAX - B 

応じ。 a ==最初の点、及びb ==第二の点

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 
すなわち
+0

Bの後のドットは何ですか、それは何を表していますか? –

+0

'X 0'が常に真です – duedl0r

+0

申し訳ありません、私は明らかに 'B-A stryba

0

(6〜1)ラップアラウンドポイントと交差しない場合には、約半以上です、ラップアラウンドポイントを越えてください!

+0

これは簡単な解決策ですが、私のプロジェクトではOKです。しかし、より多くの数字がある場合、これは本当に効率的ではありません。 –

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

を考慮

1

真理値表を使った私の解答です(ちょうど良いことを確認してください)。 ABSはAbsolute Valueを求めています。

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(B-A)<最大/ 2)==(X2 = B-A> 0)

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 } 

代わりに、6の円のサイズをbに追加します(bが小さい場合)。

両方とも動作しますが、両方のウェイの長さが等しい場合、結果が異なることがあります。

(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 
関連する問題