2012-02-08 78 views
5

假設我們有一個編號的圓。我們想從A點走到B點,但我們不知道我們是應該左轉還是右轉。你如何使用數字計算你應該去哪個方向?簡單,簡短,邏輯算法(哪個方向去?)

例子:

我們目前都在1我們想去5.我可以看到vissualy即5更接近,所以我們去的權利。還要注意,你總是面向內部。

img

+0

始終號碼,以便?你的「可見範圍」是什麼? – Nicholas 2012-02-08 21:39:24

+0

是的,數字總是按順序排列,你「看到」(知道)所有的數字。 – 2012-02-08 21:41:52

+2

執行模塊化(基本n)減法並在n/2上使用閾值。 – ElKamina 2012-02-08 22:00:29

回答

2

首先確保您所做的每個計算都是模6(或n)。這意味着-2模6 = 4.然後,您可以計算一次順時針行程和一次逆時針。順時針行程是B-A,逆時針A-B。然後比較這兩個結果,較低的一個獲勝。

實施例:

A = 1,B = 5

順時針

舉動:BA = 4
計數器CW移動:AB = -4 = 2

實施例2:

A = 5,B = 1

順時針

舉動:BA = 2
計數器CW移動:甲-B = 4

+0

簡單,快速,卓越!謝謝 – 2012-02-08 22:01:48

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

與B>相應A,交換位置。

+0

B之後的點是什麼,它代表什麼? – 2012-02-08 21:49:33

+0

'X 0'始終爲真 – duedl0r 2012-02-08 22:10:07

+0

對不起,我明顯是指'B-A stryba 2012-02-08 23:03:47

0

考慮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

這是一個簡單的解決方案,我猜我的項目可以。但是,如果有更多的數字,這並不是很有效。 – 2012-02-08 21:51:10

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)大於圍繞中途,穿過環繞點!

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

1

我有你兩個遞歸的,簡單的解決方案階。其基本思路是,該方式不應該超過半圈,這恰好是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