1. 程式人生 > >博弈論入門之nim遊戲

博弈論入門之nim遊戲

更好的閱讀體驗點這裡

nim遊戲

nim遊戲

有兩個頂尖聰明的人在玩遊戲,遊戲規則是這樣的:

\(n\)堆石子,兩個人可以從任意一堆石子中拿任意多個石子(不能不拿),沒法拿的人失敗。問誰會勝利

nim遊戲是巴什博奕的升級版(不懂巴什博奕的可以看這裡)

它不再是簡單的一個狀態,因此分析起來也棘手許多

如果說巴什博奕僅僅博弈論的一個引子的話,

nim遊戲就差不多算是真正的入門了

博弈分析

面對新的博弈問題,我們按照套路,從簡單的情況入手

當只有一堆石子的時候,先手可以全部拿走。先手必勝

當有兩堆石子且石子個數相同的時候,先手不論拿多少,後手都可以從另一堆中拿同樣多的石子,先手必敗,否則先手必勝

當有三堆的時候呢?

當有\(n\)堆的時候呢?

這樣玩下去卻是很繁瑣,不過前輩們總結出了一條非常厲害的規律!

定理解析

定理

對於nim遊戲,前輩們發現了一條重要的規律!

\(n\)堆石子的數量異或和等於\(0\)時,先手必勝,否則先手必敗

證明

\(\oplus\)表示異或運算

nim遊戲的必敗態我們是知道的,就是當前\(n\)堆石子的數量都為零

\(a[i]\)表示第\(i\)堆石子的數量,那麼當前局面就是

$0 \oplus 0 \oplus 0 \oplus \dots \oplus 0 = 0 $

  • 對於先手來說,如果當前局面是

\(a_1 \oplus a_2 \oplus a_3 \oplus \dots \oplus a_n = k\)

那麼一定存在某個\(a_i\),它的二進位制表示在\(k\)最高位上一定是\(1\)

我們將\(a_i \oplus k\),這樣就變成了

\(a_1 \oplus a_2 \oplus a_3 \oplus \dots \oplus a_n \oplus k = 0\)

此時先手必勝

  • 對於先手來說,如果當前局面是

\(a_1 \oplus a_2 \oplus a_3 \oplus \dots \oplus a_n = 0\)

那麼我們不可能將某一個\(a_i\)異或一個數字後使得

\(a_1 \oplus a_2 \oplus a_3 \oplus \dots \oplus a_n = 0\)

此時先手必敗

程式碼

#include<cstdio>
using namespace std;
int a[10001]; 
int main()
{
    int Test;
    scanf("%d",&Test);
    while(Test--)
    {
        int ans=0,N;
        scanf("%d",&N);
        for(int i=1;i<=N;i++) scanf("%d",&a[i]);
        for(int i=1;i<=N;i++) ans=ans^a[i];
        ans==0?printf("No\n"):printf("Yes\n");
    }
    return 0;
}

題目

臨時還沒有做太多題目,以後做多了慢慢補吧

題解

估計沒幾個人能一眼秒吧233

題解

相關推薦

博弈論入門nim遊戲

更好的閱讀體驗點這裡 nim遊戲 nim遊戲 有兩個頂尖聰明的人在玩遊戲,遊戲規則是這樣的: 有\(n\)堆石子,兩個人可以從任意一堆石子中拿任意多個石子(不能不拿),沒法拿的人失敗。問誰會勝利 nim遊戲是巴什博奕的升級版(不懂巴什博奕的可以看這裡) 它不再是簡單的一個狀態,因此分析起來也棘手許

(博弈論) 51NOD 1069 Nim遊戲

示例 temp 51nod retext ... 模型 inpu bsp pri 有N堆石子。A B兩個人輪流拿,A先拿。每次只能從一堆中取若幹個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。假設A B都非常聰明,拿石子的過程中不會出現失誤。給出N及每堆石子的數

博弈論入門威佐夫博弈

威佐夫博弈 威佐夫博弈是一類經典的博弈問題 有兩堆石子,兩個頂尖聰明的人在玩遊戲,每次每個人可以從任意一堆石子中取任意多的石子或者從兩堆石子中取同樣多的石子,不能取得人輸,分析誰會獲得勝利 博弈分析 威佐夫博弈不同於Nim遊戲與巴什博奕,它的特殊之處在於不能將兩堆石子分開分析。 前輩們在對該博弈遊戲做了大

博弈論入門斐波那契博弈

斐波那契博弈 斐波那契博弈是一種經典的博弈問題 有一堆石子,兩個頂尖聰明的人玩遊戲,先取者可以取走任意多個,但不能全取完,以後每人取的石子數不能超過上個人的兩倍 結論 斐波那契博弈有一個非常重要的性質: 先手必敗,當且僅當石子數為斐波那契數 是不是很神奇?? 證明: 懶得看了,這裡有 程式碼 #incl

博弈論入門巴什博奕

巴什博奕 巴什博奕: 兩個頂尖聰明的人在玩遊戲,有\(n\)個石子,每人可以隨便拿\(1-m\)個石子,不能拿的人為敗者,問誰會勝利 巴什博奕是博弈論問題中基礎的問題 它是最簡單的一種情形對應一種狀態的博弈 博弈分析 我們從最簡單的情景開始分析 當石子有\(1-m\)個時,毫無疑問,先手必勝 當石子有

博弈 Nim 遊戲&poj 3537 Crosses and Crosses

Nim遊戲的定義 Nim遊戲是組合遊戲(Combinatorial Games)的一種,準確來說,屬於“Impartial Combinatorial Games”(以下簡稱ICG)。滿足以下條件的遊戲是ICG(可能不太嚴謹): 有兩名選手

洛谷.2197.nim遊戲(博弈論 Nim)

博弈 problem main pan fine 不能 cpp tro 博弈論 題目鏈接 後手必勝(先手必敗,P-position)當且僅當n堆石子數異或和為0。 首先0一定是P-position, 假設a1^a2^a3^...^an=K 若K!=0,則一定可以找到一個ai

BZOJ_3105_[cqoi2013]新Nim遊戲_線性基+博弈論

不存在 不可 con 傳統 規則 output bzoj brush int BZOJ_3105_[cqoi2013]新Nim遊戲_線性基+博弈論 Description 傳統的Nim遊戲是這樣的:有一些火柴堆,每堆都有若幹根火柴(不同堆的火柴數量可以不同)。兩個遊

nim遊戲,洛谷P2197,博弈論?數論?貪心?

正題       這題有一個結論:就是異或和不為0的先手必勝,否則後手必勝。       因為異或和不為0時,可以通過取走一些石子使得異或和為0,接下來後手取完之後,先手繼續取到異或和為0. #include<cstd

Godot3遊戲引擎入門二:第一個簡單的遊戲場景

一、前言 最近工作時間安排地非常緊湊,除了週日一天,已經沒有其他空閒時間了。不過到了 10 月份會慢慢恢復,目前我在抽出一點時間好好準備這個 Godot 系列,邊寫邊學習邊迎接Godot 3.1 版本的到來,也算是一件高興地事情,哈哈。 :sunglasses:

Godot3遊戲引擎入門三:移動我們的主角

一、前言 說明:我目前使用的 Godot 3.1 預覽版,所以會與 Godot 3 的版本有一些區別,介面影響不大,如果要使用我上傳的 Github Demo 程式碼,記得去官網下載 3.1 預覽版(或者等之後正版釋出)然後就可以正常開啟執行 Demo 了。

title: Godot3遊戲引擎入門四:給主角新增動畫(下)

一、前言 本篇是上一節文章:Godot3遊戲引擎入門之四:給主角新增動畫(上)的繼續。在這兩篇文章裡,我會詳細講述 Godot 3 中製作簡單精靈動畫的三種方法,其中上部分包含兩種,下部分討論第三種方式。 :smile: 二、正文 本篇目標 使用動

Godot3遊戲引擎入門五:上下左右移動動畫(下)

一、前言 本篇是上一節文章:Godot3遊戲引擎入門之五:上下左右移動動畫(上)的繼續。上一篇使用動畫和程式碼實現了玩家的上下左右移動功能,接下來我們解決一個問題:給遊戲新增碰撞體,讓玩家在有限的地圖中移動。 注意:我目前使用的是 Godot 3.1 預覽版,與

CocosCreatorKUOKUO帶你入門3D小遊戲-躲避方塊

本次引擎2.1.0 編輯工具VSCode 目標:3D小遊戲躲避方塊 2.1.0版本已經出來好幾天了,雖然有些地方還不夠完善, 但是畢竟是能寫3D遊戲了,簡單的來寫一個,嘻嘻。 console.log(滑稽) 準備好了嗎?GO! 新建個工程,然後把畫布的大小都減去個0。

Godot3遊戲引擎入門六:製作TileMap瓦片地圖

一、前言 收到一個高興的訊息: 2018 年 Github 最新統計出爐, Godot 是所有專案裡增長速度最快的第三位!所以,我還是非常看好它的,哈哈!連結在此: Fastest growing open source projects ,截圖如下: 吹逼結

Godot3遊戲引擎入門九:建立UI介面並新增背景音樂

一、前言 本文開篇必須提到兩個值得高興的訊息: 有讀者專門給我來信了,鼓勵我堅持下去,有點受寵若驚,心裡非常高興,希望有更多讀者,更多交流,有建議歡迎留言到我的微信公眾號或者部落格。 新預覽版: Godot 3.1 Alpha2 已經發布,也就是第二個預覽版

【轉】博弈論--取物品和Nim遊戲

以Nim遊戲為例來進行一下計算。比如說我剛才說當只有兩堆石子且兩堆石子數量相等時後手有必勝策略,也就是這是一個P-position,下面我們依靠定義證明一下(3,3)是一個P-position。首先(3,3)的子局面(也就是通過合法移動可以導致的局面)有(0,3)(1,3)(2,3)(顯然交換石子堆的位置不

取球遊戲_博弈論入門學習

先看第一個簡單的博弈入門問題,這是一個取球問題,題目如下: 今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定:每個人從盒子中取出的球的數目必須是:1,3,7或者8個

詳解博弈論的一類問題——Nim遊戲

先來一道例題: 甲,乙兩個人玩 N i m

遊戲開發入門俄羅斯方塊

程式分析 俄羅斯方塊是由多種型別的方塊與遊戲邊界背景組成,根據面向物件的方法,把整個程式分隔成兩部分--遊戲主體、形狀兩個物件。 其中游戲主體處理的事情包括: 繪製遊戲介面與邊界。容納方塊與形狀並繪製。控制器:監聽鍵盤事件,並將之轉換成對形狀物件的控制,如變形、左移、右移、