2012-02-08 82 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