Membangun jawaban SimonW , berikut ini adalah algoritma eksplisit:
Membiarkan squaresmenjadi array yang diindeks oleh lokasi pemain, dan berisi, untuk setiap lokasi yang mungkin, baik indeks lokasi lain atau nilai khusus NULL. (Anda mungkin ingin menyimpan ini sebagai array yang jarang.) Nilai yang mungkin dari entri dalam array ini dapat ditafsirkan sebagai berikut:
- Jika
squares[S]adalah NULL, alun-alun Sbebas untuk pindah ke.
- Jika
squares[S] == S, salah satu pemain di Stidak dapat atau tidak akan bergerak, atau dua (atau lebih) pemain mencoba untuk pindah Spada saat yang sama dan keduanya ditolak.
- Jika tidak,
squares[S]akan berisi indeks kuadrat dari mana pemain ingin pindah ke kuadrat S.
Di setiap belokan, inisialisasi semua entri squareske NULLdan kemudian jalankan algoritma berikut:
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
Setelah itu, ulangi daftar pemain sekali lagi, dan pindahkan yang bisa melakukannya:
for each player:
current := the player's current location;
if not squares[current] == current:
move player;
end if
end for
Karena setiap gerakan hanya dapat direncanakan satu kali dan dibatalkan paling banyak sekali, algoritma ini akan berjalan dalam waktu O ( n ) untuk n pemain bahkan dalam kasus terburuk.
(Sayangnya, algoritme ini tidak akan menghentikan pemain untuk berpindah tempat atau melintasi jalur secara diagonal. Mungkin dimungkinkan untuk menyesuaikan trik dua langkah Gajet dengannya, tetapi cara yang sepenuhnya naif untuk melakukannya tidak akan bekerja dan saya terlalu lelah untuk mencari cara yang lebih baik sekarang.)