Aufbauend auf der Antwort von SimonW folgt ein expliziter Algorithmus:
Sei squares
ein 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 S
frei betreten werden.
- Wenn
squares[S] == S
sich entweder der Spieler von S
nicht bewegen kann oder will oder zwei (oder mehr) Spieler gleichzeitig zu bewegen versuchten S
und 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 squares
to NULL
und 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.)