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 }
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 }
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 }
博文參考:http://blog.csdn.net/ac_gibson/article/details/41624623