第六章 數學問題 -------- 6.2【Nim遊戲】高僧鬥法
先來看看Nim定理:
// 若干堆硬幣,二人輪流取,從一堆硬幣中取幾個 直到某個人不能取硬幣 那這個人就輸了
// 3 4 5
// 3 3 把硬幣變成相同的 那麼你就贏了 因為你可以跟著另一個人一樣的取法
// 尼姆定理: 無偏差的二人遊戲 ===== 尼姆堆
/*
* 11
* 100
* ^ 101
* ------------
* 010
* 先手:若非 0,必贏,因為可以把局面變成0這個局面
* 若是 0,必輸,因為這個局面本身就是贏的,你隨便動一步,那另一個人保持跟你同步,所以最後必輸。
*/
public class Nim {
public static void main(String[] args) {
int []A = {3,3};
boolean res = solve(A);
System.out.println(res);
}
static boolean solve(int []A){
int res = 0;
for (int i = 0; i < A.length; i++) {
res ^= A[i];
}
System.out.println(Integer.toBinaryString(res));
return res !=0;
}
}
再來看這道題目:
我們可以將和尚從後往前(從左到右)兩兩配對,若為奇數則在最高位補充一個假想的和尚,在同一對和尚中,如果對手移動前一個和尚,你總能移動後一個和尚相同的步數,所以一對和尚的前一個和尚與前面一對和尚的後一個和尚之間有多少臺階是沒有影響的。所以只要考慮同一對和尚之間有多少臺階就行了,這樣就轉化為了Nim遊戲。
如圖: a與b配對, c與d配對 ,那麼b與c之間的臺階是沒有影響的,無論b怎麼移動,a總能夠移動相同的步數。如果該Nim遊戲為必勝,那麼我們只要移動配對和尚中的後一和尚就好了,如果對手想要破壞這種Nim遊戲,即他想移動配對中的前一和尚,那麼我們可以移動後面一對的前一個和尚使得依然保持Nim遊戲的局勢。如果Nim遊戲必敗,那麼先手者可能想破壞Nim遊戲,那麼後手者按照剛才的方式保持Nim遊戲即可。
程式碼:
import java.util.Scanner;
// 高僧鬥法 所有這類的博弈問題都可以歸結為尼姆遊戲 Nim
/*
* 高僧鬥法 =====> 尼姆遊戲
* 把小和尚位置間的空隙 === > 尼姆堆
* 偶數:兩兩組合
* 奇數:在最高階補充一個假想的小和尚
*
*/
public class Test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String A = in.nextLine();
String[] arrayA = A.split(" ");
int[] NimHeap = new int[arrayA.length - 1];
for(int i = 1;i < arrayA.length;i++)
// 兩個和尚的間距作為尼姆堆
NimHeap[i - 1] = Integer.valueOf(arrayA[i]) - Integer.valueOf(arrayA[i - 1]) - 1;
int sum = 0;
// i+2 就是為了用一個for實現n為奇和偶的兩種情況,奇數時最後一個數不分到組中,偶數時需要將其分到組中。
for(int i = 0;i < NimHeap.length;i = i + 2)
sum ^= NimHeap[i];
if(sum == 0)
System.out.println("-1");
else {
for(int i = 0;i < arrayA.length - 1;i++) {
for(int j = 1;j + Integer.valueOf(arrayA[i]) < Integer.valueOf(arrayA[i + 1]);j++) {
NimHeap[i] -= j;
if(i != 0)
NimHeap[i - 1] += j;
sum = 0;
for(int k = 0;k < NimHeap.length;k = k + 2)
sum ^= NimHeap[k];
if(sum == 0) {
System.out.println(arrayA[i]+" "+(Integer.valueOf(arrayA[i])+j));
return;
}
NimHeap[i] += j;
if(i != 0)
NimHeap[i - 1] -= j;
}
}
}
}
}
結果:
相關文章
- LeetCode每日一題:Nim遊戲(No.292)LeetCode每日一題遊戲
- 第六章 數學問題 ----------6.13 素數的篩法(第十萬零二個素數)
- NIM遊戲/SG函式遊戲函式
- 第六章 數學問題 -------- 6.12 素數及質因數分解
- Nim遊戲2(臺階型)遊戲
- 博弈論:公平組合遊戲(Nim 遊戲 & SG 定理)學習筆記遊戲筆記
- 第六章 數學問題 -------- 6.1【巧用進位制】天平稱重問題
- 第六章 數學問題 -------- 6.14 【快速冪】斐波那契數列
- 第六章 數學問題 -------- 6.10 特殊的同餘方程—逆元
- 遊戲戰鬥力數值研究(一)遊戲
- 歷屆試題 數字遊戲(數學)遊戲
- 第六章 數學問題 -------- 6.4 演算法必備求和公式演算法公式
- 無法超越的怪獵系列,關於共鬥遊戲的戰鬥思考遊戲
- 第六章 數學問題 -------- 6.9 天平稱重問題【線性同餘方程】青蛙的約會
- 文字格鬥遊戲遊戲
- 遊戲心理學研究:關於鄧巴數法則遊戲
- 第六章 數學問題 -------- 6.11【同餘方程組】POJ1006 生理週期
- 《鬼鬥》Steam: “純粹”的格鬥遊戲遊戲
- 格鬥遊戲修羅場:鬼人和他的遊戲開發哲學遊戲開發
- 遊戲數值乾貨:RPG戰鬥數值開源示範遊戲
- 第六章 數學問題 -------- 6.5 歐幾里得演算法及其擴充套件演算法套件
- P4301 [CQOI2013] 新Nim遊戲 線性基遊戲
- 遊戲學基礎建設芻議:建設“遊戲學”的幾個疑難問題遊戲
- 這款放置修仙遊戲,詮釋了何為“御劍鬥法”遊戲
- 第六章 數學問題 -------- 6.7【擴充套件歐幾里得】一步之遙套件
- 遊戲心理學研究:《少女前線2》的文案問題遊戲
- LeetCode數學問題(Python)LeetCodePython
- 約瑟夫環(Josephus)問題--報數遊戲(連結串列)遊戲
- 遊戲戰鬥的設計分析遊戲
- 遊戲是否存在價值問題?遊戲
- 遊戲引擎數學庫 Plane遊戲引擎
- 遊戲《鬥遊鬥地主》被撤銷出版物號,為今年首款遊戲
- python 來做數學問題Python
- 填數字遊戲解題機遊戲
- 如何做好回合制遊戲的戰鬥體驗? 戰鬥數值公式設計詳解遊戲公式
- 遊戲流失分析方法2 問卷調查法遊戲
- 如果宮鬥遊戲玩起了換裝遊戲
- 皇家龍虎鬥遊戲下載 16606959990遊戲