博弈
一、巴什博弈
?巴什博弈的題目一般是有一堆物品共n個(gè),兩個(gè)人輪流取物品,每次只能取1~m個(gè)。最后取光者勝利。
解題方法:
?res=n%(m+1);
??若res=0,則先取者必?cái)?#xff0c;反之,后取者必?cái) ?/span>
拓展:
?若題目為先取完者失敗,則res=(n-1)%(m+1);
?當(dāng)res=0時(shí)后取者勝利。
二、威佐夫博弈
?威佐夫博弈題目一般有兩堆數(shù)量若干的東西,兩個(gè)人輪流從某一堆或同時(shí)從兩堆中取同樣多的物品。
?規(guī)定每次至少取一個(gè),多者不限,最后取光者得勝。
?解題方法:
??面對(duì)非奇異局勢,先拿者必勝,反之,后拿者取勝。
?對(duì)于奇異局勢的判斷:
?若兩堆東西的數(shù)量(a,b)滿足
?ak=[k(1+sqrt(5.0))/2];
??bk=ak+k;?
??則此時(shí)局面為奇異局勢。
三、Nim博弈
?有三堆(或多堆)若干個(gè)物品,兩個(gè)人輪流從某一堆取任意多的物品。
?規(guī)定每次至少取一個(gè),多者不限,最后取光者得勝。
?解題方法:
?將所有堆物品的數(shù)量進(jìn)行異或操作,最后結(jié)果若為0,則先取者必?cái)?#xff0c;結(jié)果非零,則先取者必勝。
四、公平組合博弈
?SG函數(shù):
?
int f[N],SG[MAXN],S[MAXN]; void getSG(int n) {memset(SG,0,sizeof(SG));for(int i = 1; i <= n; i++){memset(S,0,sizeof(S));for(int j = 0; f[j] <= i && j <= N; j++)S[SG[i-f[j]]] = 1; for(int j = 0;; j++) if(!S[j]){SG[i] = j;break;}} }
總結(jié)
- 上一篇: java中ofd文件转pdf_java
- 下一篇: java程序源代码如何保存到桌面_如何编