Спираючись на відповідь SimonW , ось чіткий алгоритм:
Дозвольте squares
бути масивом, індексованим місцями програвача, і містить для кожного можливого місця розташування або індекс іншого місця розташування, або спеціальне значення NULL
. (Ви можете зберегти це як розріджений масив.) Можливі значення записів у цьому масиві можуть бути інтерпретовані так:
- Якщо
squares[S]
є NULL
, то площа S
може вільно переміщатися в.
- Якщо
squares[S] == S
, або гравець уS
може або не зможе рухатися, або два (або більше) гравців намагалися перейти S
одночасно, і їм обом було відмовлено.
- В іншому випадку
squares[S]
буде містити індекс площі, з якої гравець хоче перейти на квадратS
.
На кожному кроці ініціалізуйте всі записи squares
до, NULL
а потім запустіть наступний алгоритм:
for each player:
current := the player's current location;
target := the location the player wants to move to (may equal current);
if squares[target] is NULL:
squares[target] := current; // target is free, mark planned move
else
// mark the target square as contested, and if necessary, follow
// the pointers to cancel any moves affected by this:
while not (target is NULL or squares[target] == target):
temp := squares[target];
squares[target] := target;
target := temp;
end while
// mark this player as stationary, and also cancel any moves that
// would require some else to move to this square
while not (current is NULL or squares[current] == current):
temp := squares[current];
squares[current] := current;
current := temp;
end while
end if
end for
Після цього знову проведіть список гравців і перемістіть тих, хто може це зробити:
for each player:
current := the player's current location;
if not squares[current] == current:
move player;
end if
end for
Оскільки кожен хід може бути запланований лише один раз і скасований не більше одного разу, цей алгоритм буде працювати в n ( n ) час протягом n гравців, навіть у гіршому випадку.
(На жаль, цей алгоритм не зупинить гравців перемикати місця або перетинати доріжки по діагоналі. Можливо, вдасться адаптувати двоступеневу хитрість Гаджета , але повністю наївний спосіб зробити це не спрацює, і я занадто втомився тільки зараз з'ясувати кращий спосіб.)