Простой, короткий, логичный алгоритм (в каком направлении идти?) - PullRequest
5 голосов
/ 09 февраля 2012

Предположим, у нас есть пронумерованный круг.Мы хотим перейти из пункта А в пункт Б, но мы не знаем, следует ли нам идти влево или вправо.Как бы вы, используя числа, вычислили, в каком направлении вам следует идти?

Пример:

В настоящее время мы находимся на 1. Мы хотим перейти на 5Я вижу визуально, что 5 ближе, поэтому мы идем направо.Также обратите внимание, что вы всегда обращены внутрь.

img

Ответы [ 6 ]

2 голосов
/ 09 февраля 2012

Сначала убедитесь, что все ваши вычисления выполняются по модулю 6 (или n).Это означает -2 по модулю 6 = 4. Затем вы можете рассчитать один раз по часовой стрелке и один против часовой стрелки.По часовой стрелке отключение BA, против часовой стрелки AB.Затем сравните эти два результата, выигрывает нижний.

Пример:

A = 1, B = 5

по часовой стрелке: BA = 4против часовой стрелки: AB = -4 = 2

Пример 2:

A = 5, B = 1

движение по часовой стрелке: BA = 2счетчик непрерывного хода: AB = 4

2 голосов
/ 09 февраля 2012
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 голос
/ 09 февраля 2012

У меня есть два простых рекурсивных решения для 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, если он меньше.

Оба работают, но иногда отличаются в результате, если оба пути имеют одинаковую длину.

С параметром для размера и нечетного размера вы получите одинаковый результат для обоих:

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
1 голос
/ 09 февраля 2012

Вот мое решение с таблицей истинности (просто чтобы проверить правильно). АБС короток для абсолютного значения.

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) 0)

0 голосов
/ 09 февраля 2012

С учетом 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 голосов
/ 09 февраля 2012
clockWise = B - A <  A + MAX - B

с B> A, поменяйте местами соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...