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

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

时间:2016-07-24 13:28:24      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

威佐夫博弈博弈论 直接模拟即可 值得一提的是这道题几乎网上所有题解都没有考虑只从小堆取得情况 所以在类似 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

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

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

标签:

原文地址:http://www.cnblogs.com/GeniusYang/p/5700430.html

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