博弈論

1. Vijos 萌萌的糖果博弈 && 吃糖果遊戲ios

每次能夠任意拿走其中一堆糖果;若是這時候另外一堆糖果數目多於1粒,就把它任意分紅兩堆,不然就把剩下的一粒糖果取走並得到此次博弈的勝利。

萌萌的糖果博弈
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {
 7     string a,b;
 8     while(cin>>a)
 9     {
10         if(a[0]=='-')break;
11         cin>>b;
12         int a1= a[a.length()-1]-'0';
13         int b1= b[b.length()-1]-'0';
14         if((a1%5==2||a1%5==3)&&(b1%5==2||b1%5==3))
15             printf("SheepDaddy\n");
16         else
17             printf("MengMeng\n");
18     }
19     return 0;
20 }

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {
 7     string a,b;
 8     while(cin>>a>>b)
 9     {
10         int a1= a[a.length()-1]-'0';
11         int b1= b[b.length()-1]-'0';
12         if((a1%5==2||a1%5==3)&&(b1%5==2||b1%5==3))
13             printf("Shadow\n");
14         else
15             printf("Matrix67\n");
16     }
17     return 0;
18 }
吃糖果遊戲

 2. 巴什博奕ide

  只有一堆n個物品,兩我的輪流從中取物,規定每次最少取一個,最多取m個,最後取光者爲勝。spa

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,m;
 6     while(cin>>n>>m)
 7       if(n%(m+1)==0)  cout<<"後手必勝"<<endl;
 8       else cout<<"先手必勝"<<endl;
 9     return 0;
10 }
待檢驗

3. 威佐夫博弈(Wythoff Game)(*黃金分割).net

  有兩堆各若干的物品,兩人輪流從其中一堆取至少一件物品,至多不限,或從兩堆中同時取相同件物品,規定最後取完者勝利。3d

POJ 1067 code

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     int a,b;
 6     while(~scanf("%d%d",&a,&b))
 7     {
 8         putchar( ((a<b?a:b)==(int)(abs(a-b)*1.618033988749895)?'0':'1') );
 9         putchar('\n');
10     }
11     return 0;
12 }
噁心的AC代碼

4. 尼姆博弈(Nimm Game):blog

  有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能從一堆物品中取部分或所有物品,最少取一件,取到最後一件物品的人獲勝。遊戲

結論就是:把每堆物品數所有異或起來,若是獲得的值爲0,那麼先手必敗,不然先手必勝。ci

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4 using namespace std;
 5 int main()
 6 {
 7     int n,ans,temp;
 8     while(cin>>n)
 9     {
10         temp=0;
11         for(int i=0;i<n;i++)
12         {
13             cin>>ans;
14             temp^=ans;
15         }
16         if(temp==0)  cout<<"後手必勝"<<endl;
17         else cout<<"先手必勝"<<endl;
18     }
19     return 0;
20 }
View Code

5. 斐波那契博弈:get

  有一堆物品,兩人輪流取物品,先手最少取一個,至多無上限,但不能把物品取完,以後每次取的物品數不能超過上一次取的物品數的二倍且至少爲一件,取走最後一件物品的人獲勝。

結論是:先手勝,當且僅當n不是斐波那契數(n爲物品總數)

 1 #include <iostream>  
 2 #include <string.h>  
 3 #include <stdio.h>  
 4 using namespace std;  
 5 const int N = 55;    
 6 int f[N];   
 7 void Init()  
 8 {  
 9     f[0] = f[1] = 1;  
10     for(int i=2;i<N;i++)  
11         f[i] = f[i-1] + f[i-2];  
12 }    
13 int main()  
14 {  
15     Init();  
16     int n;  
17     while(cin>>n)  
18     {  
19         if(n == 0) break;  
20         bool flag = 0;  
21         for(int i=0;i<N;i++)  
22         {  
23             if(f[i] == n)  
24             {  
25                 flag = 1;  
26                 break;  
27             }  
28         }  
29         if(flag) puts("Second win");  
30         else     puts("First win");  
31     }  
32     return 0;  
33 } 
View Code

 

 

博文參考:http://blog.csdn.net/ac_gibson/article/details/41624623

相關文章
相關標籤/搜索