Aufbauend auf der Antwort von SimonW folgt ein expliziter Algorithmus:
Sei squaresein Array, das von den Player-Standorten indiziert wird und für jeden möglichen Standort entweder den Index eines anderen Standorts oder den speziellen Wert enthält NULL. (Möglicherweise möchten Sie dies als spärliches Array speichern.) Die möglichen Werte der Einträge in diesem Array können wie folgt interpretiert werden:
- Wenn
squares[S]ja NULL, kann das Quadrat Sfrei betreten werden.
- Wenn
squares[S] == Ssich entweder der Spieler von Snicht bewegen kann oder will oder zwei (oder mehr) Spieler gleichzeitig zu bewegen versuchten Sund beide abgelehnt wurden.
- Andernfalls
squares[S]wird der Index des Quadrats enthalten, von dem ein Spieler zum Quadrat wechseln möchte S.
Initialisieren Sie in jeder Runde alle Einträge von squaresto NULLund führen Sie dann den folgenden Algorithmus aus:
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
Danach durchlaufen Sie die Liste der Spieler noch einmal und verschieben Sie diejenigen, die dazu in der Lage sind:
for each player:
current := the player's current location;
if not squares[current] == current:
move player;
end if
end for
Da jeder Zug nur einmal geplant und höchstens einmal abgebrochen werden kann, wird dieser Algorithmus auch im schlimmsten Fall in O ( n ) Zeit für n Spieler ausgeführt.
( Leider hindert dieser Algorithmus die Spieler nicht daran, Plätze zu wechseln oder Pfade diagonal zu kreuzen. Es ist möglicherweise möglich, Gajets Zweistufentrick darauf abzustimmen , aber die völlig naive Art, dies zu tun, funktioniert nicht und ich bin zu müde um einen besseren Weg zu finden.)