Bài toán trò chơi thú vị
Trang 1Một số bài toán trò chơi
Ngô Minh Đức
A Giới thiệu
Trong bài viết này chúng ta sẽ xét một số bài toán trò chơi, từ dễ đến khó Về nguyên tắc, các bài toán trò chơi thường được cho dưới dạng: nhập vào một trạng thái của trò chơi, tìm nước đi “tốt nhất” có thể được, hoặc nhập vào một trạng thái của trò chơi, khẳng định người đi trước sẽ thắng hay thua, v.v
1 Trò chơi bốc sỏi
Đây là trò chơi đơn giản nhất, luật chơi như sau:
Có 2 người chơi, I và II và một đống sỏi có khối lượng là 21 viên
Mỗi nước đi được phép lấy không qúa 3 viên ra khỏi đống, nhưng phải lấy ít nhất 1 viên Hai người lần lượt đi và người I đi trước Ai lấy được viên sỏi cuối cùng sẽ thắng
Hướng dẫn: sau khi phân tích, dễ dàng nhận thấy người I luôn luôn thắng, chỉ cần đưa về
các vị trí 20,16,12,8,4 viên sỏi là được
Tổng quát nếu mỗi bước đi không được phép lấy qúa k viên sỏi, ta sẽ có các vị trí thắng
là bội số của k+1 Nếu n là bội số của k+1 thì người II thắng, còn không thì người I thắng
Nếu đổi luật thành người lấy được viên sỏi cuối cùng thì thua, ta cũng tìm được một chiến thuật chơi tốt Vị trí thắng là các vị trí thắng ban đầu cộng thêm 1
2 Làm rỗng và phân chia
Có hai cái hộp, ban đầu một hộp chứa m viên sỏi, hộp kia chứa n viên sỏi Ta kí hiệu là (m,n) với m>0, n>0 Hai người chơi lần lượt đi Một nước đi được phép làm rỗng (lấy hết sỏi ra) một hộp, và chia số sỏi trong hộp còn lại vào hai hộp, với ít nhất một viên trong mỗi hộp Người nào không đi được nữa là thua
Nhập vào: (m,n)
Xuất ra: WIN nếu người đi trước thắng, LOSE nếu người đi trước thua
Hướng dẫn: Vị trí thắng là các vị trí (m,n) sao cho cả m và n đều lẻ
Trang 2Chứng minh: dùng phép quy nạp
Rõ ràng (1,1) là vị trí thắng
Giả sử điều khẳng định đúng với các vị trí (x,y), x,y<=n Ta chứng minh điều khẳng đỉnh đúng với các vị trí (x,y), x,y<=n+1
Ta chứng minh điều khẳng định đúng với các vị trí (m,n+1) trong đó m<=n+1
Nếu n lẻ => n+1 chẵn Ta cần chứng minh (m,n+1) là vị trí thua
Thật vậy (m,n+1)->(1,n) Theo gỉa thiết quy nạp (1,n) là vị trí thắng Do đó (m,n+1) là vị trí thua
Nếu n chẵn => n+1 lẻ
+ Nếu m chẵn, ta cần chứng minh (m,n+1) là vị trí thua
Thật vậy (m,n+1)->(1,m-1) Do m<=n+1 => m-1<=n => theo gt quy nạp (1,m-1) là vị trí thắng Do đó (m,n+1) à vị trí thua
+ Nếu m lẻ, ta cần chứng minh (m,n+1) là vị trí thắng
Thật vậy xét một nước đi bất kỳ từ (m,n+1) ta chứng minh nó là vị trí thua
- Trường hợp lấy m viên sỏi ra khỏi hộp 1
Ta có (m,n+1)->(p,q) trong đó p+q=n+1, p, q<=n Do n+1 lẻ => p chẵn hoặc q chẵn Theo gỉa thiết quy nạp => (p,q) là vị trí thua
- Trường hợp lấy n+1 viên sỏi ra khỏi hộp 2
Ta có (m,n+1)->(p,q) trong đó p+q=m Ta có p,q<=m-1<=n+1-1=n Do m lẻ => p chẵn hoặc q chẵn Theo gia thiết quy nạp => (p,q) là vị trí thua
Vậy (m,n+1) là vị trí thắng
Tương tự đối với các vị trí có dạng (n+1, m) trong đó m<=n+1
3 Ăn sôcôla
Một thanh sôcôla có dạng hình chữ nhật mxn, chia thành các ô vuông Hai người chơi lần lượt đi Một nước đi được phép bẻ một miếng sôcôla về phía góc trên phải để ăn Ô (1,1)
là vị trí có thuốc độc, người nào ăn phải thuốc độc trước là thua
Trang 3Ví dụ ban đầu thanh sôcôla có kích thước 8x3, người I bẻ tại (6,2), người 2 bẻ tại (2,3) thì còn lại thanh sôcôla như hình trên Ô có dấu gạch chéo là ô có thuốc độc
Chứng minh rằng luôn tồn tại một nước đi thắng (nước đi đảm bảo thắng lợi) cho người
đi trước
Hướng dẫn: Xét nước đi chỉ bẻ 1 ô duy nhất (m,n), nếu đây là nước đi thắng, ta có điều
phải chứng minh Ngược lại, nếu đây là một nước đi thua, thế thì từ vị trí này người II sẽ
có một nước đi thắng, nhưng rõ ràng vị trí mới đạt được này sau khi người II đi cũng có thể đạt được từ vị trí ban đầu Bằng cách đi đến vị trí này ngay từ đầu, người I sẽ có một nước đi thắng Vậy luôn tồn tại nước đi thắng cho người đi trước
4 Trò chơi 3 đống sỏi
Có 3 đống sỏi, lần lượt gồm a,b,c viên sỏi Hai người lần lượt đi Mỗi nước đi được phép chọn một đống bất kỳ và lấy số lượng viên sỏi tùy ý ra khỏi đống đó, nhưng phải lấy ít nhất 1 Người nào lấy được viên sỏi cuối cùng là thắng
Nhập vào: a,b,c
Xuất ra: LOSE nếu khẳng định người đi trước thua, còn không xuất ra a’,b’,c’ là nước đi
“tối ưu” của người đi trước Nếu có nhiều nước đi tối ưu, chỉ cần xuất ra 1
Hướng dẫn: vị trí thắng là các vị trí thỏa điều kiện: a xor b xor c = 0
Chứng minh: dựa vào tính chất của phép xor:
a xor a = 0 với mọi a
a xor b = b xor a
(a xor b) xor c = a xor (b xor c)
Vậy cách đi là như sau: từ vị trí (a,b,c)
Đặt a’=b xor c, b’ = a xor c, c’=b xor a
Nếu a’
Nếu b’
Nếu c’<>
Trang 4B Một số trò chơi khác
1 Đồng xu lăn
Có một hàng các ô vuông được đánh số 0,1,2,3, Có một số lượng hữu hạn các đồng
xu được đặt trên các ô vuông, có thể có nhiều đồng xu trên cùng một ô Hai người chơi lần lượt đi Mỗi nước đi được phép lấy một trong các đồng xu và di chuyển về một ô bất kỳ ở bên trái Trò chơi kết thúc khi tất cả đồng xu đều nằm ở ô 0 Người
đi cuối cùng thắng
Dữ liệu vào: DONGXU.IN
Dòng 1: n – số lượng ô vuông ban đầu
n dòng sau, dòng i chứa một số nguyên là số đồng xu trên ô i tại thời điểm ban đầu Kết qủa: DONGXU.OUT
Gồm 1 dòng duy nhất, là “WIN” nếu khẳng định người đi trước thắng, “LOSE” nếu khẳng định người đi trước thua
2 Đồng xu trên cầu thang
Một cầu thang với n bậc chứa các đồng xu trên một số bậc Bậc i chứa xi đồng xu, i=1,2, n Một nước đi được phép di chuyển một số dương đồng xu từ bậc i xuống bậc i-1 Đồng xu chạm phải sàn nhà (bậc 0) được loại khỏi trò chơi Trò chơi kết thúc khi mọi đồng xu đã nằm trên sàn nhà Hai người chơi lần lượt đi, người đi cuối cùng thắng.
Dữ liệu vào: CAUTHANG.IN
Dòng 1: n – số lượng bậc thang
n dòng sau, dòng i chứa một số nguyên không âm xi là số đồng xu trên bậc thang i tại thời điểm ban đầu
Dữ liệu vào đảm bảo người đi trước luôn có nước đi thắng
Kết qủa file: DONGXU.OUT: xuất ra nước đi tối ưu cho người đi trước
Gồm 2 số nguyên i k, i là số hiệu bậc thang cần chuyển đồng xu xuống, k là số đồng
xu cần chuyển xuống Nếu có nhiều nước đi tối ưu cần xuất ra nước đi có số hiệu bậc thang phải chuyển là nhỏ nhất
Trang 53 Ít nhất một nửa
Có n đống sỏi Hai người chơi lần lượt đi Mỗi nước đi được phép chọn một đống sỏi bất kỳ và lấy ít nhất một nửa số sỏi trong đống đó Người lấy được viên sỏi cuối cùng là thắng Hãy giúp xác định người đi trước thắng hay thua (để phục vụ cho một tổ chức cá cược)
Dữ liệu vào: MOTNUA.IN
Dòng 1: n - số đống sỏi
n dòng sau: dòng i gồm 1 số nguyên dương là số lượng viên sỏi trên đống i
Kết qủa: MOTNUA.OUT
In ra “WIN” nếu khẳng định người đi trước thắng, “LOSE” nếu khẳng đỉnh người
đi trước thua.
4 Trò chơi bảng
Bàn cờ là một bảng một chiều gồm các hố, có thể lên đến 60 hố Mỗi người chơi cầm một trong hai loại cờ, trắng hoặc đỏ (kí hiệu W và R) Một nước đi được phép di chuyển một quân cờ bất cứ đâu trên bàn cờ, miễn là nó không chạm hoặc nhảy qua quân cờ khác Người nào không đi được nữa là thua
Nếu trò chơi chỉ có 1 quân cờ mỗi loại, cách chơi đơn giản là đi quân cờ đến sát cạnh quân đối phương Với 2 quân cờ mỗi loại, trò chơi trở nên phức tạp hơn:
Hơn nữa có thể xảy ra trạng thái hòa:
Yêu cầu: nếu người đi trước có thể thắng, hãy xác định nước đi tối ưu, còn không thì
xác định kết cục là người đi trước thua hay hòa.
Dữ liệu vào: BOARD.IN
Một dòng duy nhất gồm một chuỗi 60 ký tự, mỗi ký tự mô tả một hố trên bàn cờ: ‘0’
là hố rỗng, ‘1’ là quân cờ thuộc về người I, ‘2’ là quân cờ thuộc về người II Hai người chơi có cùng số lượng quân cờ, và có ít nhất 2 hố rỗng trên bàn cờ
Trang 6Kết qủa: BOARD.OUT
Xuất ra:
+ ‘0’ nếu ván đấu kết thúc hòa
+ ‘2’ nếu người I sẽ thua
+ ‘1’ nếu người I sẽ thắng Trong trường hợp này theo sau ‘1’ phải mô tả nước đi tối
ưu, gồm 2 số, là thứ tự của hố nguồn và hố đích mà quân cờ di chuyển Nếu có nhiều nước đi, chọn nước đi có hố nguồn mang thứ tự nhỏ nhất Nếu vẫn có nhiều nước đi, trong các nước đi này, chọn nước đi có hố đích mang thứ tự nhỏ nhất.