อาคารในคำตอบของ SimonWที่นี่เป็นขั้นตอนอย่างชัดเจน:
อนุญาตเป็นอาร์เรย์จัดทำดัชนีโดยสถานที่เล่นการพนันและมีสำหรับสถานที่ที่เป็นไปได้ในแต่ละทั้งดัชนีของสถานที่อื่นหรือมูลค่าพิเศษsquares
NULL
(คุณอาจต้องการเก็บสิ่งนี้เป็นอาร์เรย์หร็อมแหร็ม) ค่าที่เป็นไปได้ของรายการในอาร์เรย์นี้อาจตีความได้ดังนี้:
- ถ้า
squares[S]
เป็นNULL
เช่นนั้นสี่เหลี่ยมS
มีอิสระที่จะย้ายเข้าไป
- หาก
squares[S] == S
ผู้เล่นที่S
ไม่สามารถหรือไม่เคลื่อนไหวหรือผู้เล่นสองคน (หรือมากกว่า) พยายามย้ายไปS
ในเวลาเดียวกันและถูกปฏิเสธทั้งคู่
- มิฉะนั้นจะมีดัชนีของตารางจากการที่ผู้เล่นต้องการที่จะย้ายไปที่ตาราง
squares[S]
S
ในแต่ละเทิร์นให้เริ่มต้นรายการทั้งหมดของsquares
ถึงNULL
แล้วเรียกใช้อัลกอริทึมต่อไปนี้:
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
หลังจากนั้นวนรอบรายชื่อผู้เล่นอีกครั้งและย้ายผู้ที่สามารถทำได้:
for each player:
current := the player's current location;
if not squares[current] == current:
move player;
end if
end for
เนื่องจากการย้ายแต่ละครั้งสามารถวางแผนได้เพียงครั้งเดียวและยกเลิกได้มากที่สุดหนึ่งครั้งอัลกอริทึมนี้จะทำงานในเวลา O ( n ) สำหรับผู้เล่นnคนแม้ในกรณีที่เลวร้ายที่สุด
(อนิจจาอัลกอริธึมนี้จะไม่หยุดผู้เล่นจากการเปลี่ยนสถานที่หรือเส้นทางข้ามในแนวทแยงมุมมันอาจเป็นไปได้ที่จะปรับกลอุบายสองขั้นตอนของ Gajetแต่วิธีที่ไร้เดียงสาอย่างสมบูรณ์ในการทำเช่นนั้นจะไม่ทำงาน เพื่อหาวิธีที่ดีกว่าตอนนี้)