三種簡單的博弈

2021-06-23 00:24:57 字數 2556 閱讀 6916

博弈問題:(1)、對於必勝狀態,一定有乙個後繼是必敗的;

(2),對於必敗狀態,它的所有後繼是必勝的;

巴什博奕:

1、  本遊戲是乙個二人遊戲;

2、  有一堆石子一共有n個;

3、  兩人輪流進行;

4、  每走一步可以取走1…m個石子;

5、  最先取光石子的一方為勝;

如果遊戲的雙方使用的都是最優策略,請輸出哪個人能贏。

巴什博奕可以用sg函式來推導,但是時間複雜度太高。可以直接將其轉化為n = k*(m+1) + r; 如果 r > 0, 則先手一定會贏

簡單的巴什博奕題目 hdu1846;

sg函式能過

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define max 1010

#define inf int_max

#define eps 1e-6

#define rep(i,n) for (int i=0; i<(n); i++)

#define for(i,s,t) for (int i=(s); i<=(t); i++)

using namespace std;

int vis[max],sg[max];

int main()

for (int j=0; ; j++)

}} if (sg[n] == 0) printf("second\n");

else printf("first\n");

} return 0;

}

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define max 1000

#define inf int_max

#define eps 1e-6

#define rep(i,n) for (int i=0; i<(n); i++)

#define for(i,s,t) for (int i=(s); i<=(t); i++)

using namespace std;

int main()

else printf("first\n");

}return 0;

}

威佐夫博奕:

問題描述:有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。

判斷當前狀態必敗狀態的依據:為必敗態,當且僅當a = (i*(1+sqrt(5) / 2)(向下取整) ,b = a + i;

poj1067簡單的威佐夫博奕;

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define max 1000

#define inf int_max

#define eps 1e-8

using namespace std;

int main()

else printf("1\n");

} return 0;

}

尼姆博奕:

問題描述:有n堆火柴,數量分別為a,b,c,d,,,,每次可以從任意一堆中至少拿走一根,也可以去全部拿走,但不能從多根火柴中同時拿。無法拿火柴的遊戲者輸。

解法:l.bouton定理:如果a xor b xor c xor d ,,, = 0,則先受敗,否則先手勝。

簡單的尼姆博奕poj 2234;

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define max 1010

#define inf int_max

#define eps 1e-6

#define rep(i,n) for (int i=0; i<(n); i++)

#define for(i,s,t) for (int i=(s); i<=(t); i++)

using namespace std;

int main(){

int m,a;

while(scanf("%d",&m) != eof){

int res = 0;

for (int i=0; i

三種博弈想法

取石子問題 有一種很有意思的遊戲,就是有物體若干堆,可以是火柴棍或是圍棋子等等均可。兩個人輪流從堆中取物體若干,規定最後取光物體者取勝。這是我國民間很古老的乙個遊戲,別看這遊戲極其簡單,卻蘊含著深刻的數學原理。下面我們來分析一下要如何才能夠取勝。一 巴什博奕 bash game 只有一堆n個物品,兩...

三種博弈問題

一 巴什博弈 bash game 只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取m個。最後取光者得勝。很容易想到當n m 1 0時,先取必勝,第一次先拿走n m 1 以後每個回合到保持兩人拿走的物品總和為m 1即可。這個遊戲還可以有一種變相的玩法 兩個人輪流報數,每次至少報...

演算法 三種博弈問題

有一種很有意思的遊戲,就是有物體若干堆,可以是火柴棍或是圍棋子等等均可。兩個人輪流從堆中取物體若干,規定最後取光物體者取勝。這是我國民間很古老的乙個遊戲,別看這遊戲極其簡單,卻蘊含著深刻的數學原理。下面我們來分析一下要如何才能夠取勝。一 巴什博奕 bash game 只有一堆n個物品,兩個人輪流從這...