1×N 棋盤,M 個棋子可重疊放置。雙方輪流將任一棋子向左移動任意距離(不超出邊界)。所有棋子移至 0 號格時遊戲結束,最後移動者勝。Rabbit 先手,輸出勝負。
每個棋子獨立構成一個子遊戲:位置 k 的棋子等價於大小為 k 的 Nim 堆。移動棋子從 k 到 j (j < k) 等價於從大小 k 的堆取走 k-j 個石子。多棋子疊放互不影響(各自獨立)。
根據 Sprague-Grundy 定理,總遊戲 SG 值 = 所有棋子位置異或和:
SG = k₁ ⊕ k₂ ⊕ ... ⊕ kₘ
SG ≠ 0 ⇒ 先手必勝(Rabbit Win!),SG = 0 ⇒ 先手必敗(Grass Win!)
#include <cstdio>
int main() {
int m;
while (scanf("%d", &m) == 1 && m) {
int xorsum = 0;
for (int i = 0; i < m; i++) {
int pos;
scanf("%d", &pos);
xorsum ^= pos;
}
puts(xorsum ? "Rabbit Win!" : "Grass Win!");
}
return 0;
}
輸入: 2 3 5 3 3 5 6 0 輸出: Rabbit Win! (3⊕5=6≠0) Grass Win! (3⊕5⊕6=0)