码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2177 —— (威佐夫博弈)

时间:2016-07-22 18:39:28      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

  威佐夫博弈奇异态(必败态)的条件是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\n");
24             continue;
25         }
26         else
27         {
28             printf("1\n");
29             if(a_k<a)printf("%d %d\n",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",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",n,m);
53                     break;
54                 }
55             }
56         }
57     }
58 }

 

HDU 2177 —— (威佐夫博弈)

标签:

原文地址:http://www.cnblogs.com/zzyDS/p/5695892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!