SimonW'un cevabı üzerine inşa , burada açık bir algoritma var:
Izin vermek squares
oyuncu 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 S
hareket etmekte serbesttir.
- Eğer
squares[S] == S
, ya oyuncunun oynamaması ya da oynamaması S
ya da iki (ya da daha fazla) oyuncu S
aynı 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 squares
için NULL
ve 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.)