SimonW'un cevabı üzerine inşa , burada açık bir algoritma var:
Izin vermek squaresoyuncu konumları tarafından endeksli ve olası her konum için, başka bir konumun dizin veya özel değer içeren bir dizi NULL. (Bunu seyrek bir dizi olarak saklamak isteyebilirsiniz.) Bu dizideki girişlerin olası değerleri aşağıdaki gibi yorumlanabilir:
- Eğer
squares[S]öyleyse NULL, kare Shareket etmekte serbesttir.
- Eğer
squares[S] == S, ya oyuncunun oynamaması ya da oynamaması Sya da iki (ya da daha fazla) oyuncu Saynı anda oynamayı denediyse ve ikisi de reddedilirse.
- Aksi takdirde,
squares[S]bir oyuncunun kareye taşımak istediği karenin dizinini içerir S.
Her dönüşte, her girdileri başlatmak squaresiçin NULLve aşağıdaki algoritmayı çalıştırın:
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
Bundan sonra, oyuncular listesinde tekrar dolaşın ve bunu yapabilenleri taşıyın:
for each player:
current := the player's current location;
if not squares[current] == current:
move player;
end if
end for
Her hareket sadece bir kez planlanabildiğinden ve en fazla bir kez iptal edilebildiğinden, bu algoritma en kötü durumda bile n oyuncu için O ( n ) zamanında çalışacaktır .
(Ne yazık ki, bu algoritma oyuncuların yer değiştirmesini veya yolları çapraz olarak geçmesini engellemeyecektir. Gajet'in iki adımlı hilesini buna uyarlamak mümkün olabilir , ancak bunu yapmanın tamamen naif yolu işe yaramaz ve çok yorgunum şimdi daha iyi bir yol bulmak için.)