番号のついた円があるとします。私たちはA地点からB地点に行きたいと思っていますが、左か右に行くべきかはわかりません。どのようにあなたは、数字を使って、あなたが行くべき方向を計算しますか?シンプルで短い論理アルゴリズム(どちらの方向に向いていますか)
例:私たちは現在、1に我々は5に行きたいされている
私は5が近いので、我々は右に行くされていることをvissualy見ることができます。また、常に内側に向かっていることに注意してください。 B> A、スワップ位置に
番号のついた円があるとします。私たちはA地点からB地点に行きたいと思っていますが、左か右に行くべきかはわかりません。どのようにあなたは、数字を使って、あなたが行くべき方向を計算しますか?シンプルで短い論理アルゴリズム(どちらの方向に向いていますか)
例:私たちは現在、1に我々は5に行きたいされている
私は5が近いので、我々は右に行くされていることをvissualy見ることができます。また、常に内側に向かっていることに注意してください。 B> A、スワップ位置に
まず、すべての計算が法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
シンプルでクイックで優れた!ありがとう –
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
すなわち
(6〜1)ラップアラウンドポイントと交差しない場合には、約半以上です、ラップアラウンドポイントを越えてください!
これは簡単な解決策ですが、私のプロジェクトではOKです。しかし、より多くの数字がある場合、これは本当に効率的ではありません。 –
If B > A
If B - A > max/2, head CCW, else CW
Else
If A - B > max/2, head CW, else CCW
を考慮
真理値表を使った私の解答です(ちょうど良いことを確認してください)。 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)
私はあなたのための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
は常に番号順になっている:
テスト(出力が凝縮):サイズのパラメータ、および奇数サイズで
は、あなたはどちらも同じ結果を得ますか?視界の "範囲"は何ですか? – Nicholasはい、数字は常に順番に並んでいて、すべての数字を「見る」(知っています)。 –
モジュール式(ベースn)減算を実行し、n/2にしきい値を使用します。 – ElKamina