hdu2177----取(2堆)石子游戏

威佐夫博弈博弈论 直接模拟即可 值得一提的是这道题几乎网上所有题解都没有考虑只从小堆取得情况 所以在类似 19 20这种数据出现时,他们都是错误的 只输出了 1 2 而没有 12 20 

 1 #include <cstdio>
 2 
 3 #include <cmath>
 4 
 5 #include <map>
 6 
 7 #include <string.h>
 8 
 9 #define inf 0x3f3f3f3f
10 
11 const int maxn=1000000;
12 
13 using namespace std;
14 
15 int a,b;
16 
17 bool judge(int a,int b){
18 
19    return a==(int)((b-a)*(sqrt(5.0)+1)/2);
20 }
21 
22 int main()
23 {
24     while(scanf("%d%d",&a,&b)!=EOF&&(a||b)){
25         map<int,int> flag;
26         if(judge(a,b)){
27                 printf("0\n");
28         } else {
29           printf("1\n");
30           for(int i=0,j=0;i<=a;i++){
31                 if(!flag[i]&&!flag[i+j]){
32                // printf("%d %d\n",i,i+j);
33                 flag[i]=flag[i+j]=1;
34                 if(a-i==b-i-j&&a>i&&b>i+j)
35                 printf("%d %d\n",i,i+j);
36                 /*else if((a==i+j&&b>i)||(a==i&&i+j<b)||(b==i+j&&a>i)) printf("%d %d\n",i,i+j);*/
37                 j++;
38                 }
39         }
40         flag.clear();
41         for(int i=0,j=0;i<=a;i++){
42                 if(!flag[i]&&!flag[i+j]){
43                // printf("%d %d\n",i,i+j);
44                 flag[i]=flag[i+j]=1;
45                /* if(a-i==b-i-j&&a>i&&b>i+j)
46                 printf("%d %d\n",i,i+j);*/
47                 if((a==i+j&&b>i)||(a==i&&i+j<b)||(b==i+j&&a>i)) printf("%d %d\n",i,i+j);
48                 j++;
49                 }
50         }
51         }
52     }
53     return 0;
54 }
View Code

这道题提醒我们,网上看题解,不管多大的大牛写的,也一定要带上自己的思考。

posted @ 2016-07-24 12:01  GeniusYang  阅读(205)  评论(0编辑  收藏  举报