Dựa trên câu trả lời của SimonW , đây là một thuật toán rõ ràng:
Đặt squares
là một mảng được lập chỉ mục bởi các vị trí người chơi và chứa, cho mỗi vị trí có thể, hoặc chỉ mục của một vị trí khác hoặc giá trị đặc biệt NULL
. (Bạn có thể muốn lưu trữ phần này dưới dạng một mảng thưa thớt.) Các giá trị có thể có của các mục trong mảng này có thể được hiểu như sau:
- Nếu
squares[S]
là NULL
, hình vuông S
là tự do để di chuyển vào.
- Nếu
squares[S] == S
, người chơi S
không thể hoặc sẽ không di chuyển, hoặc hai (hoặc nhiều) người chơi đã cố gắng di chuyển đến S
cùng một lúc và đều bị từ chối.
- Nếu không,
squares[S]
sẽ chứa chỉ mục của hình vuông mà người chơi muốn chuyển sang hình vuông S
.
Trên mỗi lượt, khởi tạo tất cả các mục của squares
để NULL
và sau đó chạy các thuật toán sau đây:
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
Sau đó, lặp lại danh sách người chơi và di chuyển những người có thể làm như vậy:
for each player:
current := the player's current location;
if not squares[current] == current:
move player;
end if
end for
Vì mỗi lần di chuyển chỉ có thể được lên kế hoạch một lần và hủy nhiều nhất một lần, thuật toán này sẽ chạy trong thời gian O ( n ) cho n người chơi ngay cả trong trường hợp xấu nhất.
(Than ôi, thuật toán này sẽ không ngăn người chơi chuyển đổi địa điểm hoặc băng qua các đường chéo. Có thể điều chỉnh thủ thuật hai bước của Gajet với nó, nhưng cách hoàn toàn ngây thơ để làm như vậy sẽ không hiệu quả và tôi quá mệt mỏi để tìm ra một cách tốt hơn ngay bây giờ.)