HDU 2177 —— (威佐夫博弈)

  威佐夫博弈奇异态(必败态)的条件是a[k]=[k*(sqrt(5.0)+1.0)/2.0]。暴力找出必败态即可。

  代码如下:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <math.h>
 4 #include <vector>
 5 #include <map>
 6 #include <set>
 7 using namespace std;
 8 typedef pair<int,int> pii;
 9 const int N = 1000000 + 5;
10 
11 int main()
12 {
13     int a,b;
14     while(scanf("%d%d",&a,&b)==2)
15     {
16         if(a==0 && b==0) break;
17 
18         if(a>b) swap(a,b);
19         int k = b-a;
20         int a_k = (sqrt(5.0)+1.0)/2.0*k;
21         if(a_k == a)
22         {
23             printf("0
");
24             continue;
25         }
26         else
27         {
28             printf("1
");
29             if(a_k<a)printf("%d %d
",a_k,a_k+k);
30             double x = (sqrt(5.0)+1.0)/2.0;
31             set<pii> S;
32             for(int i=b-1;i>=0;i--)
33             {
34                 int n = a;
35                 int m = i;
36                 if(n > m) swap(n,m);
37                 int k = m - n;
38                 if(n == (int)(k * x))
39                 {
40                     printf("%d %d
",n,m);
41                     S.insert(pii(n,m));
42                     break;
43                 }
44             }
45             for(int i=a-1;i>=0;i--)
46             {
47                 int n = i;
48                 int m = b;
49                 int k = m - n;
50                 if(n == (int)(k * x) && S.find(pii(n,m))==S.end())
51                 {
52                     printf("%d %d
",n,m);
53                     break;
54                 }
55             }
56         }
57     }
58 }
原文地址:https://www.cnblogs.com/zzyDS/p/5695892.html