日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

博弈之 取石子1——6)

發(fā)布時(shí)間:2025/3/18 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 博弈之 取石子1——6) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

一.巴什博奕(Bash?Game):

首先我們來玩一個(gè)比較古老的報(bào)數(shù)游戲。AB一起報(bào)數(shù),每個(gè)人每次最少報(bào)一個(gè),最多報(bào)4個(gè)。輪流報(bào)數(shù),看誰先報(bào)到30.

如果不知道巴什博弈的可能會(huì)覺得這個(gè)是個(gè)有運(yùn)氣成分的問題,但是如果知道的人一定知道怎樣一定可以贏。

比如A先報(bào)數(shù)的話,那么B一定可以贏(這里假定B知道怎么正確的報(bào)數(shù))

B可以這樣報(bào)數(shù),每次報(bào)5-k(A)個(gè)數(shù),其中k(A)A報(bào)數(shù)的個(gè)數(shù)這樣的話沒一次

兩人報(bào)完數(shù)之后會(huì)變成5?10?15?20?25?30這樣是不是B一定會(huì)贏呢?是不是有一種被欺騙的感覺呢?好吧下面我們來看看這個(gè)原理。我們先看下一個(gè)一眼就能看出答案的例子?比如說我們報(bào)到5(4+1),每次報(bào)最多報(bào)4個(gè),最少報(bào)1個(gè).那么是不是后者一定可以贏呢?答案是肯定的。好了到這巴什博弈的精髓基本就OK了。

那么如果我們要報(bào)到n+1,每次最多報(bào)n個(gè),最少報(bào)1個(gè)的話,后者一定能夠贏。

現(xiàn)在我們需要報(bào)數(shù)到n,而每次最多報(bào)數(shù)m個(gè),最少報(bào)數(shù)1個(gè).我們可以化成這樣

n?=?k*(1+m)+r(0?<=?r?<=?m)這樣的話如果r不等于0那么先手一定會(huì)贏,為什么呢?首先先手報(bào)r個(gè),那么剩下k(1+m)個(gè)數(shù),那么我們每次報(bào)數(shù)1+m-k(B)個(gè)數(shù)就一定能保證最后剩下1+m個(gè),那么就到了上面我們說的那個(gè)了,先手就一定會(huì)贏,如果r=0那么后手一定會(huì)贏,道理一樣的

#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #define CLR(arr, val) memset(arr, val, sizeof(arr)) using namespace std;int main() {//freopen("Input.txt", "r", stdin);int N, num, limit;scanf("%d", &N);while(N--){scanf("%d%d", &num, &limit);if(num % (limit + 1) != 0) //必勝局面printf("Win\n");elseprintf("Lose\n");}return 0; }

二.威佐夫博奕(Wythoff?Game):

???這種博弈比前面一種要稍微復(fù)雜一點(diǎn)。我們來看下下面這個(gè)游戲。

???有兩堆火柴棍,每次可以從某一堆取至少1根火柴棍(無上限),或者從兩堆取相同的火柴棍數(shù)。最后取完的是勝利者。好了,如果你不知道這個(gè)博弈定理,對(duì)于小數(shù)目的火柴棍數(shù),可能還能推出來,但是如果火柴棍數(shù)一多,就不行了。看了下面的這個(gè)介紹,你也會(huì)有一種被騙的感覺。

???首先我們知道兩堆火柴是沒有差別的,也就是說第一堆有a,第二堆有b根和第一堆有b,第二堆有a根是一樣的結(jié)果。

???我們用一個(gè)二維的狀態(tài)(a,b)來記錄當(dāng)前剩下的火柴數(shù),表示第一堆剩下a根火柴,第二堆剩下b根火柴。同樣我們假設(shè)兩個(gè)人的編號(hào)是AB,且A先取。

那么如果某個(gè)人遇到了這樣的狀態(tài)(0,0)那么也就是說這個(gè)人輸了。這樣的狀態(tài)我們叫做奇異狀態(tài),也可以叫做失敗態(tài)。

那么接下來的幾個(gè)失敗態(tài)為(1,2),(3,5),(4,7),(6,10),(8,13)……

我們用a[i]表示失敗態(tài)中的第一個(gè),b[i]表示失敗態(tài)中的第二個(gè).(i0開始).

那么我們可以看到b[i]?=?a[i]+i;i?>=?0,a[i]是前面的失敗態(tài)中沒有出現(xiàn)過的最小的整數(shù)

下面我們可以得到三個(gè)基本的結(jié)論。

??1.每個(gè)數(shù)僅包含在一個(gè)失敗態(tài)中

??首先我們知道a[k]是不可能和前面的失敗態(tài)中的a[i],b[i]重復(fù)的(這點(diǎn)由a[i]的得到可以知道)

b[k]?=?a[k]+k?>?a[k-1]+k>a[k-1]+k-1+1>a[k-1]+(k-1)?=?b[k-1]>a[k-1]這樣我們知道每個(gè)數(shù)僅在一個(gè)失敗態(tài)中。

??2.每個(gè)失敗態(tài)可以轉(zhuǎn)到非失敗態(tài)。

?加入當(dāng)前的失敗態(tài)為(a,b),那么如果我們只在一堆中取的話,肯定會(huì)變成非失敗態(tài)(這點(diǎn)由第一點(diǎn)可以保證),如果從兩堆同時(shí)取的話,由于每個(gè)失敗態(tài)的差是不一樣的,所以也不可能得到一個(gè)失敗態(tài)。也就是說一個(gè)失敗態(tài)不管你怎么取,都會(huì)得到一個(gè)非失敗態(tài)。

???3.每個(gè)非失敗態(tài)都可以轉(zhuǎn)到一個(gè)失敗態(tài)

對(duì)于這個(gè)結(jié)論,首先我們要知到每個(gè)狀態(tài)(a,b)要么a?=?a[i],要么b?=?b[i].(每個(gè)數(shù)都出現(xiàn)在一個(gè)失敗態(tài)中),下面我們分兩種情況來討論

???I.a?=?a[i].如果b?=?a的話那么一次取完就變成了(0,0).如果b?>?b[i]的話,那么我們從第二堆中取走b-b[i]就變成了一個(gè)失敗態(tài)。如果b?<?b[i].那么我們從兩堆中同時(shí)取走a-a[b-a[i]]這樣得到失敗態(tài)(a[b-a[i]],a[b-a[i]]+b-a[i])(a[i]?=?a)

???II.b?=?b[i].如果a?>?a[i]那么我們從第一堆中取走a-a[i]根火柴.

??????????????如果a?<?a[i].這里又分兩種情況。第一是a?=?a[k](k?<?i)

那么我們從第二堆取走b?-?b[k]就行了。

第二是a?=?b[k]這樣的話由于兩堆火柴是沒有區(qū)別的,所以我們把b變成a[k]就行了,也即是從第二堆火柴中取走b?-?a[k]就變成了失敗態(tài)

至于怎么判斷一個(gè)狀態(tài)是否是失敗態(tài).我們可以用下面的方法來判斷(本人暫時(shí)還不會(huì)證明)

??a[i]?=?[i*(1+5)/2](這里的中括號(hào)表示向下取整)???b[i]?=?a[i]+i;

??那么這就是一個(gè)失敗態(tài)

#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #define CLR(arr, val) memset(arr, val, sizeof(arr)) using namespace std;int main() {//freopen("Input.txt", "r", stdin);int num1, num2, tmp; //第一堆剩的數(shù)量為num1,第二堆剩num2while(scanf("%d%d", &num1, &num2) != EOF){if(num1 > num2)swap(num1, num2); tmp = floor((num2 - num1) * (1 + sqrt(5.0)) / 2.0); //黃金分割if(tmp == num1) printf("Lose\n"); //奇異局勢必?cái)lse printf("Win\n");}return 0; }

三.尼姆博奕(Nimm?Game):

??

指的是這樣的一個(gè)博弈游戲,目前有任意堆石子,每堆石子個(gè)數(shù)也是任意的,雙方輪流從中取出石子,規(guī)則如下:
1)每一步應(yīng)取走至少一枚石子;每一步只能從某一堆中取走部分或全部石子;
2)如果誰取到最后一枚石子就勝。
也就是尼姆博弈(Nimm Game)。
必?cái)【置?#xff1a;也叫奇異局勢。無論做出何出操作,最終結(jié)果都是輸?shù)木置妗1財(cái)【置娼?jīng)過2次操作后,可以達(dá)到另一個(gè)必?cái)【置妗?br style="padding-bottom:0px; padding-top:0px; padding-left:0px; margin:0px; padding-right:0px" /> 必勝局面:經(jīng)過1次操作后可以達(dá)到必?cái)【置妗?br style="padding-bottom:0px; padding-top:0px; padding-left:0px; margin:0px; padding-right:0px" /> 即當(dāng)前局面不是必?cái)【置婢褪潜貏倬置?#xff0c;而必勝局面可以一步轉(zhuǎn)變成必?cái)【置妗?br style="padding-bottom:0px; padding-top:0px; padding-left:0px; margin:0px; padding-right:0px" /> 最終狀態(tài):
(1)最后剩下一堆石子;(必勝局面)
(2)剩下兩堆,每堆一個(gè);(必?cái)【置?#xff09;
(3)當(dāng)石子剩下兩堆,其中一堆只剩下1顆,另一堆剩下多于n顆石子時(shí),當(dāng)前取的人只需將多于1顆的那一堆取出n-1顆,則局面變?yōu)閯偛盘岬降谋財(cái)【置妗?#xff08;必勝局面)
判斷當(dāng)前局勢是否為必勝(必?cái)?#xff09;局勢:
1)把所有堆的石子數(shù)目用二進(jìn)制數(shù)表示出來,當(dāng)全部這些數(shù)按位異或結(jié)果為0時(shí)當(dāng)前局面為必?cái)【置?#xff0c;否則為必勝局面;
2)在必勝局面下,因?yàn)樗袛?shù)按位異或的結(jié)果是大于零的,那么通過一次取,將這個(gè)(大于其它所有數(shù)按位異或的結(jié)果的)數(shù)下降到其它所有數(shù)按位異或的結(jié)果,這時(shí)局面就變?yōu)楸財(cái)【置媪恕?br style="padding-bottom:0px; padding-top:0px; padding-left:0px; margin:0px; padding-right:0px" /> 定理:一組自然數(shù)中必然存在一個(gè)數(shù),它大于等于其它所有數(shù)按位異或的結(jié)果。
證明:原命題等價(jià)于,設(shè)a1^a2^... ^an=p,p≠0時(shí),必存在k,使得ak^p<ak(當(dāng)p=0時(shí),對(duì)于任意的k,有ak^p=ak)。
設(shè)p的最高位是第q位,則至少存在一個(gè)k,使得ak的第q位也是1,而ak^p的第q位為0,所以ak^p<ak

??? 補(bǔ)綴一點(diǎn),(a^b)^b=a^(b^b)=a^0=a,所以ak^p相當(dāng)于“其它所有數(shù)按位異或的結(jié)果”。

例1:2 45 45

45^45=0,45和45的異或等于0。
例 2:3 3 6 9

局勢(3,6,9)因?yàn)?^6^9不等于0,所以這是一個(gè)必勝局勢。
 3 011

^6 110

 5 101 
即從第3堆中的9個(gè)中取走9-5=4個(gè),則(3,6,9)->(3,6,5),3^6^5=0,故(3,6,5)為奇異局勢,即從必勝局勢轉(zhuǎn)變成必?cái)【謩荨?/p> 代碼如下:#include<iostream> using namespace std; int temp[ 20 ]; //火柴的堆數(shù)int main() {int i, n, min;while( cin >> n ){for( i = 0; i < n; i++ )cin >> temp[ i ]; //第i個(gè)火柴堆的數(shù)量min = temp[ 0 ];for( i = 1; i < n ; i++ )min = min^temp[ i ]; //按位異或if( min == 0 )cout << "Lose" << endl; //輸elsecout << "Win" << endl; //贏}return 0; }還有就是斐波那契博弈,只有所給的石子數(shù)是斐波那契數(shù)就會(huì)輸,但是要注意1003的斐波那契數(shù)就已經(jīng)是超int的了。

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的博弈之 取石子1——6)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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