博弈初步 到时候 再添加吧

 

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     }
View Code

 

 

 

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 }
View Code

 

 

 

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 }
View Code

 

 

 

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 }
View Code

 

 

 

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 }
View Code

 

 

 

 

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 }
View Code

 

 

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 }
View Code

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2014-03-12 21:26  galaxy77  阅读(142)  评论(0编辑  收藏  举报