日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【博弈论】威佐夫博弈

發(fā)布時間:2024/1/18 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【博弈论】威佐夫博弈 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡介

威佐夫博弈( W y t h o f f G a m e Wythoff\ Game Wythoff?Game):有兩堆物品個數(shù)是 n n n m m m,甲乙兩個人輪流從一堆選取 k k k個物品或兩堆中選取各選取 k k k個物品,最后取完物品的人獲勝。

思路

兩堆物品數(shù)用 ( n , m ) (n,m) (n,m)表示,滿足 n ≤ m n\le m nm,如果 n > m n>m n>m則交換 n n n m m m

現(xiàn)考慮各種狀態(tài),發(fā)現(xiàn)先手必輸態(tài)如下:

n = 0 n=0 n=0時,

( 0 , 0 ) (0,0) (0,0)沒有物品甲必敗,

( 0 , m ≠ 0 ) (0,m\ne 0) (0,m?=0)有物品甲必勝。

n = 1 n=1 n=1時,

( 1 , 2 ) (1,2) (1,2)會變成乙選 ( 0 , 1 ) (0,1) (0,1), ( 0 , 2 ) (0,2) (0,2) ( 1 , 1 ) (1,1) (1,1),甲必敗,

( 1 , m ≠ 2 ) (1,m\ne 2) (1,m?=2)有物品甲必勝利。

n = 2 n=2 n=2時,

( 2 , m ) (2,m) (2,m)變成乙選 ( 0 , 2 ) (0,2) (0,2) ( 1 , 2 ) (1,2) (1,2),甲必勝。

n = 3 n=3 n=3時,

( 3 , 5 ) (3,5) (3,5)甲必敗,

( 3 , m ≠ 5 ) (3,m\ne 5) (3,m?=5)甲必勝。

進一步推算可以發(fā)現(xiàn)所有的先手必敗局為 ( 0 , 0 ) (0,0) (0,0), ( 1 , 2 ) (1,2) (1,2), ( 3 , 5 ) (3,5) (3,5), ( 4 , 7 ) (4,7) (4,7), ( 6 , 10 ) … (6,10)\dots (6,10)

這種先手必敗局叫做奇異局勢,可以發(fā)現(xiàn)第 k k k項的 n n n是前 k ? 1 k-1 k?1項中未出現(xiàn)的最小正整數(shù) i i i,而 m = i + k m=i+k m=i+k

每個人要想獲勝就是盡量使對方變成奇異局勢。

根據(jù)相關資料可以得知第 k k k項奇異局勢的 n k = k ( ( 5 ) + 1 ) 2 , m k = n k + k n_k=\frac{k(\sqrt(5)+1)}{2},m_k=n_k+k nk?=2k(( ?5)+1)?,mk?=nk?+k

bool Wythoff(int n,int m){//判斷先手且為n,m時是否取勝 if(n>m) return Wythoff(m,n);//保證n<=m int k=m-n;//計算出項數(shù)k int _n=k*(sqrt(5)+1)/2.0;//計算出必敗時的n return n!=_n;//判斷是否必敗 }

例題

hdu1527

題目描述

有兩堆石子,數(shù)量任意,可以不同。游戲開始由兩個人輪流取石子。游戲規(guī)定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時取走相同數(shù)量的石子。最后把石子全部取完者為勝者。現(xiàn)在給出初始的兩堆石子的數(shù)目,如果輪到你先取,假設雙方都采取最好的策略,問最后你是勝者還是敗者。

輸入

輸入包含若干行,表示若干種石子的初始情況,其中每一行包含兩個非負整數(shù)a和b,表示兩堆石子的數(shù)目,a和b都不大于1,000,000,000。

輸出

輸出對應也有若干行,每行包含一個數(shù)字1或0,如果最后你是勝者,則為1,反之,則為0。

樣例輸入

2 1 8 4 4 7

樣例輸出

0 1 0

參考代碼

#include <iostream> #include <cmath> using namespace std; bool Wythoff(int n,int m){//判斷先手且為n,m時是否取勝 if(n>m) return Wythoff(m,n);//保證n<=m int k=m-n;//計算出項數(shù)k int _n=k*(sqrt(5)+1)/2.0;//計算出必敗時的n return n!=_n;//判斷是否必敗 } int main(){int n,m;while(cin>>n>>m){cout<<Wythoff(n,m)<<endl;}return 0; }

總結

以上是生活随笔為你收集整理的【博弈论】威佐夫博弈的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。