减治法解决尼姆(Nim)游戏/拈游戏问题(JAVA)
尼姆游戲是一種兩個人玩的回合制數學策略游戲。游戲者輪流從一堆棋子(一共有好幾堆,一次只能從其中一堆拿。)(或者任何道具)中取走一個或者多個,最后不能再取的就是輸家。當指定相應數量時,一堆這樣的棋子稱作一個尼姆堆。
尼姆游戲有很多形式,也可以說很多游戲的原型都是尼姆游戲。
單堆尼姆游戲:
假設我們現在有一堆n枚棋子,兩個玩家輪流從堆中拿走至少1枚,至多m枚棋子。每次拿走的棋子數都可以不同,但能夠拿走的上下限數量是不變的。如果每個玩家都做出了最佳選擇,哪個玩家能夠拿到最后一枚棋子?是先走的還是后走的?
我們認為n=0是一個敗局,因為接下來要走的人是第一個無路可走的人。
1. 任何1 <= s <= m(s為堆中剩余棋子)的局面都是勝局,因為玩家A總能取走所有棋子,同時得到最后一枚棋子
2. s = m + 1的局面是一個敗局,因為無論玩家A取走幾枚棋子,總能把對方推向勝局,即第一種情況。
3. 那么任意 1 + (m+1) <= s <= m +(m+1)都是一個勝局,因為無論玩家A怎么走,都會給對面一個必輸的局面。
根據數學歸納法,當且僅當n不是m+1的倍數時,n個棋子的實例是一個勝局,勝利的策略是每次拿走n mod (m+1)個棋子,如果背離這個策略,則會將勝局留給對手。
總結:如果棋子數量n為m+1的倍數,那么先手的人是一個敗局,否則先手的人是一個勝局,當然前提是雙方都知道最優策略。
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int m = in.nextInt();if (n % (m+1) == 0) {System.out.println("后手贏");} else {System.out.println("先手贏");}} }當然除了單堆尼姆游戲,還有多對尼姆游戲,巧妙的是,對于多堆尼姆游戲的解來說,它基于堆中棋子數的二進制表示。、
多堆尼姆游戲:
假設我們現在有數目分別為3、 4、 5的三堆棋子,兩個玩家輪流從其中拿走至少1枚,至多為一整堆的棋子數。每次拿走的棋子數都可以不同,但能夠拿走的下限數量是不變的。如果每個玩家都做出了最佳選擇,哪個玩家能夠拿到最后一枚棋子?是先走的還是后走的?
我們需要求出每堆棋子數的二進制數位和(也叫Nim和),即對每一位分別求和并忽略進制。
實際上,當Nim和中包含至少一個1時,該實例為一個勝局;相應的,當Nim和中只包含0時,該實例為一個敗局
所以對于先走的玩家來說,這是一個勝局,走法為改變三個位串中的一個,使Nim和僅包含0,例如從第一個堆中拿走2個。
總結
以上是生活随笔為你收集整理的减治法解决尼姆(Nim)游戏/拈游戏问题(JAVA)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Centos服务器查看当前的并发数
- 下一篇: 减治法在排序算法中的应用(JAVA)--