Lý thuyết trò chơi tổ hợp (Combinatorial Game Theory) nghiên cứu các trò chơi hai người, thông tin hoàn hảo, không có yếu tố may rủi, và người không đi được coi là thua (normal play convention).
Khái niệm cơ bản
- Trạng thái P (Previous player wins): Người vừa đi thắng — tức là người đang đến lượt thua. Đây là trạng thái thua.
- Trạng thái N (Next player wins): Người đến lượt thắng.
Quy tắc xác định:
- Trạng thái cuối (không còn nước đi) là trạng thái P (thua).
- Trạng thái N nếu tồn tại ít nhất một nước đi đến trạng thái P.
- Trạng thái P nếu mọi nước đi đều dẫn đến trạng thái N.
Nim
Trò chơi Nim: có đống đá, mỗi đống viên. Hai người thay nhau lấy bất kỳ số viên nào từ một đống. Người lấy viên cuối cùng thắng.
Định lý Sprague-Grundy cho Nim: Người đi trước thua khi và chỉ khi:
int nim_winner(vector<int>& piles) {
int xor_sum = 0;
for (int p : piles) xor_sum ^= p;
return xor_sum != 0; // true: người đi trước thắng
}
Chiến lược thắng: Tìm đống sao cho , lấy từ đống xuống còn viên.
Grundy Number (Nimber)
Grundy number của trạng thái là mex (minimum excludant) của tập Grundy number của các trạng thái kế tiếp:
// Tính Grundy number cho trò chơi đơn giản
// moves: tập nước đi hợp lệ từ trạng thái n (ví dụ: {1, 3, 4} cho Nim 1 đống)
vector<int> grundy(int max_n, vector<int>& moves) {
vector<int> G(max_n + 1, 0);
for (int n = 1; n <= max_n; n++) {
set<int> reachable;
for (int m : moves)
if (n >= m) reachable.insert(G[n - m]);
int mex = 0;
while (reachable.count(mex)) mex++;
G[n] = mex;
}
return G;
}
Ý nghĩa: là trạng thái thua (P-position). là trạng thái thắng (N-position).
Định lý Sprague-Grundy
Khi chơi đồng thời nhiều trò chơi độc lập (sum of games), Grundy number của tổng bằng XOR của các Grundy number thành phần:
// Ví dụ: nhiều đống, mỗi đống có quy tắc lấy riêng
// G_total = XOR của G(a_i) với G tính theo quy tắc lấy của mỗi đống
int total_grundy = 0;
for (int pile : piles)
total_grundy ^= G[pile]; // G tính sẵn theo quy tắc
// total_grundy == 0: người đi trước thua
Nim biến thể
Misère Nim (người lấy viên cuối thua):
- Nếu mọi đống : thắng khi số đống lẻ là chẵn.
- Nếu có đống : thắng khi XOR (ngược lại Nim thường).
Staircase Nim: Có bậc thang, mỗi bậc viên. Người đi lấy bất kỳ số viên từ bậc và chuyển xuống bậc . Chỉ xét XOR của các bậc lẻ: thắng khi .
Các trang con
- Nim và Grundy Number — chi tiết trong trang này
Bình luận