博弈題初步

2021-08-15 16:31:14 字數 1451 閱讀 3543

甲乙兩人面對若干堆石子,其中每一堆石子的數目可以任意確定。兩人輪流按下列規則取走一些石子,遊戲的規則如下:

1. 每一步應取走至少一枚石子;

2. 每一步只能從某一堆中取走部分或全部石子;

3. 如果誰無法按規則取子,誰就是輸家。

如果甲乙兩人都採取最優的策略,請問,是甲必勝還是乙必勝。

簡單的nim博弈,求一下異或和。

#include 

using

namespace

std;

int main()

puts(ans ? "win" : "lost");

}return

0;}

甲乙兩人面對若干堆石子,其中每一堆石子的數目可以任意確定。兩人輪流按下列規則取走一些石子,遊戲的規則如下:

1. 每一步只能從某一堆中至少要取走乙個石子,最多 m 個;

2. 如果誰無法按規則取子,誰就是輸家。

如果甲乙兩人都採取最優的策略,請問,是甲必勝還是乙必勝。

類似巴什博弈,把每堆石子數量減少到m以內,則問題轉化為無限制nim博弈。sg(x) = x % (m+1)。

#include 

using

namespace

std;

int main()

puts(ans ? "win" : "lost");

}return

0;}

給定一棵樹,兩人輪流從樹中選取乙個度數不為 0 的結點 (度數為 0 則不與任何邊相連) 將其與其相連的邊刪去,誰最終無法刪去結點,則誰敗。

若先手有必勝策略則輸出 first,否則輸出 second。

在樹上搜尋(或者狀壓+位運算列舉),並利用sg函式進行轉移。

#include 

using

namespace

std;

int dp[(1

<<20)+5];

vector

g[25];

int main()

for (int now = (1

<1; now >= 0; --now)

for (int i = 0; i < n; ++i)

if (now & (1

for (int j = 0; j < g[i+1].size(); ++j)

if (!(now & (1

<<(g[i+1][j]-1)))) flag = 1;

if (flag) dp[now ^ (1

<1;

}printf("%s\n", dp[0] ? "first" : "second");

}

博弈論初步

這是一道關於博弈的問題,希望以後考試中不會遇見 題目 p1290 歐幾里德的遊戲 下面直接上 includeusing namespace std typedef long long ll int main if m cout stan wins endl else cout ollie wins ...

學習筆記 博弈論初步

想到一些很棒的台詞來著。白,我們總是在開始遊戲前就獲勝。空 遊戲人生 世界如此單純,沒有贏不了的比試,努力的話怎麼都有可能,世界單純明了,勝利 失敗 平局,那是愚蠢的小孩子所想過的事 利庫 遊戲人生zero 簡要來說,就是智商爆表的人嘗試在遊戲開始之前就結束這個遊戲。並尋找到其方法 像我這種從五子棋...

博弈題演算法小結

尋找平衡狀態 也稱必敗態,奇異局勢 滿足 任意非平衡態經過一次操作可以變為平衡態 一 巴什博奕 bash game 只有一堆 n個物品 兩個人輪流從這堆物品中取物 規定每次至少取乙個 最多取m個 最後取光者得勝.n m 1 r s r為任意自然數,s m 即n m 1 0,則先取者肯定獲勝 二 威佐...