#include #include #include using namespace std; int nimSum(const vector& piles) { int result = 0; for (int cherries : piles) { result ^= cherries; } return result; } bool allEmpty(const vector& piles) { for (int cherries : piles) { if (cherries != 0) { return false; } } return true; } void printPiles(const vector& piles) { cout << "当前各碗樱桃数:"; for (int i = 0; i < static_cast(piles.size()); ++i) { if (i > 0) { cout << ", "; } cout << "[" << i + 1 << "]=" << piles[i]; } cout << '\n'; } pair computerMove(const vector& piles) { int sum = nimSum(piles); if (sum == 0) { for (int i = 0; i < static_cast(piles.size()); ++i) { if (piles[i] > 0) { return {i, 1}; } } } for (int i = 0; i < static_cast(piles.size()); ++i) { int target = piles[i] ^ sum; if (target < piles[i]) { return {i, piles[i] - target}; } } return {-1, -1}; } int main() { int n; cout << "请输入碗的数量 n:"; cin >> n; vector piles(n); cout << "请输入每只碗里的樱桃数:"; for (int i = 0; i < n; ++i) { cin >> piles[i]; } cout << "\n计算机先手。\n"; while (true) { printPiles(piles); int currentSum = nimSum(piles); if (currentSum == 0) { cout << "当前异或和为0,说明这是一个先手必败态;计算机只能任选一步合法操作。\n"; } pair move = computerMove(piles); int pileIndex = move.first; int taken = move.second; piles[pileIndex] -= taken; cout << "计算机从第" << pileIndex + 1 << "只碗里拿走了" << taken << "颗樱桃。\n"; if (allEmpty(piles)) { cout << "计算机拿到了最后一颗樱桃,计算机获胜。\n"; break; } printPiles(piles); cout << "现在轮到你。\n"; while (true) { cout << "请输入两整数:碗的编号 和 取走的樱桃数:"; int chosenPile, removed; cin >> chosenPile >> removed; --chosenPile; bool validPile = 0 <= chosenPile && chosenPile < n; bool validTake = validPile && 1 <= removed && removed <= piles[chosenPile]; if (validTake) { piles[chosenPile] -= removed; break; } cout << "输入不合法,请重新输入。\n"; } if (allEmpty(piles)) { cout << "你拿到了最后一颗樱桃,你获胜。\n"; break; } } return 0; }