Membangun jawaban SimonW , berikut ini adalah algoritma eksplisit:
Membiarkan squares
menjadi 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 S
bebas untuk pindah ke.
- Jika
squares[S] == S
, salah satu pemain di S
tidak dapat atau tidak akan bergerak, atau dua (atau lebih) pemain mencoba untuk pindah S
pada 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 squares
ke NULL
dan 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.)