博弈初步 到时候 再添加吧
poj 2234 Matches Game
http://poj.org/problem?id=2234
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 int main() 7 { 8 int i,j,n,m,t; 9 while(~scanf("%d",&n)) 10 { 11 int ans=0; 12 for(int i=0;i<n;i++) 13 { 14 scanf("%d",&m); 15 ans^=m; 16 } 17 if(ans) 18 printf("Yes\n"); 19 else printf("No\n"); 20 21 }
hdu 1847 good luck in。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 bool vis[1002]; 6 int sg[1002]; 7 8 void getsg() 9 { 10 sg[0]=0; 11 for(int i=1;i<1002;i++) 12 { 13 memset(vis,false,sizeof(vis)); 14 for(int j=0;(1<<j)<=i;j++) 15 { 16 vis[sg[i-(1<<j)]]=true; 17 } 18 for(int j=0;j<1002;j++) 19 if(vis[j]==false) 20 { 21 sg[i]=j; 22 break; 23 } 24 } 25 26 } 27 28 int main() 29 { 30 int i,j,n,m,t; 31 getsg(); 32 while(~scanf("%d",&n)) 33 { 34 35 if(sg[n]) 36 printf("Kiki\n"); 37 else printf("Cici\n"); 38 39 } 40 41 return 0; 42 }
hdu 1848 Fibonacci again and again
http://acm.hdu.edu.cn/showproblem.php?pid=1848
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 bool vis[1002]; 6 int sg[1002]; 7 int f[30]; 8 9 void getf() 10 { 11 f[1]=1; 12 f[2]=2; 13 for(int i=3;i<30;i++) 14 f[i]=f[i-1]+f[i-2];//printf("%d\n",f[i]);} 15 } 16 17 void getsg() 18 { 19 sg[0]=0; 20 for(int i=1;i<1002;i++) 21 { 22 memset(vis,false,sizeof(vis)); 23 for(int j=1;f[j]<=i;j++) 24 { 25 vis[sg[i-f[j]]]=true; 26 } 27 for(int j=0;j<1002;j++) 28 if(vis[j]==false) 29 { 30 sg[i]=j; 31 break; 32 } 33 } 34 35 } 36 37 int main() 38 { 39 int i,j,n,m,t,p; 40 getf(); 41 getsg(); 42 while(~scanf("%d%d%d",&n,&m,&p)) 43 { 44 if(n==0&&m==0&&p==0) 45 break; 46 int ans=0; 47 ans=sg[n]^sg[m]^sg[p]; 48 49 if(ans) 50 printf("Fibo\n"); 51 else printf("Nacci\n"); 52 53 } 54 55 return 0; 56 }
hdu 2509 be the winner
http://acm.hdu.edu.cn/showproblem.php?pid=2509
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int i,n,m; 6 while(cin >> n) 7 { 8 int flag = 0; //判断是否是孤单堆 9 int s = 0; 10 for(i = 0;i < n;i++) 11 { 12 cin >> m; 13 s ^= m; 14 if(m > 1) 15 flag = 1; 16 } 17 if(flag == 0) 18 if(n % 2) 19 cout << "No\n"; 20 else 21 cout << "Yes\n"; 22 else 23 if(s == 0) 24 cout << "No" <<endl; 25 else 26 cout << "Yes" <<endl; 27 } 28 return 0; 29 }
hdu 1907 john 最后取完的败
http://acm.hdu.edu.cn/showproblem.php?pid=1907
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int main() 7 { 8 int n,t; 9 scanf("%d",&t); 10 while(t--) 11 { 12 scanf("%d",&n); 13 int ans=0,a; 14 int num1=0,num2=0; 15 for(int i=0;i<n;i++) 16 { 17 scanf("%d",&a); 18 ans^=a; 19 if(a>1) 20 num1++; 21 else num2++; 22 23 } 24 if((ans&&num1>0)||(ans==0&&num1==0)) 25 printf("John\n"); 26 else printf("Brother\n"); 27 28 } 29 return 0; 30 }
hdu 2176 取(m堆)石子游戏
http://acm.hdu.edu.cn/showproblem.php?pid=2176
a^b ^ c ^ d ...=ans
a^b ^ d ...=ans^c
a^b ^ d ^ x=0
所以 x=0^a^b ^ d=0^ans^c
所以 要将当前状态变成 奇异态 的取法 : 将第i堆变成 0^ans^a[i]即可 (当然前提是 a[i]> 0^ans^a[i] )。
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<queue> 5 #include<string> 6 #define maxx 5002 7 using namespace std; 8 9 int a[200002]; 10 11 12 int main() 13 { 14 int n,m,i; 15 //getsg(); 16 while(scanf("%d",&n),n) 17 { 18 int ans=0; 19 for(i=0;i<n;i++) 20 { 21 scanf("%d",&a[i]); 22 ans^=a[i]; 23 } 24 if(ans==0) 25 printf("No\n"); 26 else 27 { 28 printf("Yes\n"); 29 for(i=0;i<n;i++) 30 if((0^ans^a[i])<a[i]) 31 printf("%d %d\n",a[i],0^ans^a[i]); 32 33 } 34 } 35 return 0; 36 }
hdu 2177 取(2堆)石子游戏
http://acm.hdu.edu.cn/showproblem.php?pid=2177 先 占个坑
hdu 1850 Being a Good Boy in Spring Festival
http://acm.hdu.edu.cn/showproblem.php?pid=1850
hdu 2960 s-nim
http://poj.org/problem?id=2960
1 #include <cstdio> 2 #include<iostream> 3 #include <cstring> 4 #include<algorithm> 5 using namespace std; 6 7 int sg[10002],a[10002]; 8 bool vis[10002]; 9 10 void getsg(int k) 11 { 12 sg[0]=0; 13 for(int i=1;i<=10000;i++) 14 { 15 memset(vis,false,sizeof(vis)); 16 for(int j=0;a[j]<=i&&j<k;j++) 17 vis[sg[i-a[j]]]=true; 18 for(int j=0;j<=10000;j++) 19 if(vis[j]==false) 20 { 21 sg[i]=j; 22 break; 23 } 24 } 25 } 26 27 int main() 28 { 29 int k,m,n; 30 while(scanf("%d",&k),k) 31 { 32 for(int i=0;i<k;i++) 33 scanf("%d",&a[i]); 34 sort(a,a+k); 35 getsg(k); 36 scanf("%d",&m); 37 while(m--) 38 { 39 int ans=0; 40 scanf("%d",&n); 41 while(n--) 42 { 43 int x; 44 scanf("%d",&x); 45 ans^=sg[x]; 46 } 47 if(ans) 48 printf("W"); 49 else printf("L"); 50 } 51 printf("\n"); 52 } 53 54 return 0; 55 }