HDOJ题目2516 取石子小游戏(博弈)
来源:互联网 发布:恺英网络待遇 编辑:程序博客网 时间:2024/06/07 09:34
取石子游戏
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2726 Accepted Submission(s): 1555
参看Sample Output.
213100000
Second winSecond winFirst win
这道题就是简单的博弈,但是分析时候要一点时间。
分析:
n = 2时输出second;
n = 3时也是输出second;
n = 4时,第一个人想获胜就必须先拿1个,这时剩余的石子数为3,此时无论第二个人如何取,第一个人都能赢,输出first;
n = 5时,first不可能获胜,因为他取2时,second直接取掉剩下的3个就会获胜,当他取1时,这样就变成了n为4的情形,所以输出的是second;
n = 6时,first只要去掉1个,就可以让局势变成n为5的情形,所以输出的是first;
n = 7时,first取掉2个,局势变成n为5的情形,故first赢,所以输出的是first;
n = 8时,当first取1的时候,局势变为7的情形,第二个人可赢,first取2的时候,局势变成n为6得到情形,也是第二个人赢,取3的时候,second直接取掉剩下的5个,所以n = 8时,输出的是second;
…………
从上面的分析可以看出,n为2、3、5、8时,这些都是输出second,即必败点,仔细的人会发现这些满足斐波那契数的规律,可以推断13也是一个必败点。
n = 12时,只要谁能使石子剩下8且此次取子没超过3就能获胜。因此可以把12看成8+4,把8看成一个站,等价与对4进行”气喘操作“。
又如13,13 = 8 + 5,5本来就是必败态,得出13也是必败态。
也就是说,只要是斐波那契数,都是必败点。
所以我们可以利用斐波那契数的公式:fib[i] = fib[i-1] + fib[i-2],只要n是斐波那契数就输出second。
#include<stdio.h>int a[45];void fun(){int i;a[0]=2;a[1]=3;for(i=2;i<=45;i++)a[i]=a[i-1]+a[i-2];}int main(){int n;fun();while(scanf("%d",&n)!=EOF,n){int i;for(i=0;i<=45;i++){if(a[i]==n)break;}if(i>45)printf("First win\n");elseprintf("Second win\n");}}
- HDOJ题目2516 取石子小游戏(博弈)
- hdoj--2516--取石子游戏(博弈)
- HDOJ 取石子游戏(威佐夫博弈)
- HDOJ 题目2076取(m堆)石子游戏(nim博弈)
- HDOJ 2516 取石子游戏 (斐波那契博弈)
- 【博弈-找规律】HDOJ 取石子游戏 2516
- NYOJ 题目135取石子(二)(博弈)
- NYOJ 题目358 取石子(五)(博弈)
- NYOJ 题目585取石子(六)(nim博弈)
- 2516取石子游戏(简单博弈)
- hdu 2516 取石子游戏(博弈)
- hdu 2516 取石子游戏 (博弈)
- HDU 2516 取石子游戏(博弈)
- 博弈-NYOJ-题目23取石子
- NYOJ题目358 取石子(五)hdu题目2516 取石子游戏 Fibonacci’s Game(斐波那契博弈)
- HDOJ 题目1527 取石子游戏(威佐夫博奕)
- 博弈(取石子)专题
- 博弈(各类取石子)
- iOS Client 与WebSocket 通信(一)
- socket函数 整理
- Failed to create BuildConfig class的解决方案
- mongodb 多 or and 逻辑查询 python实现
- Jsp out.print() 后台报out has close错误
- HDOJ题目2516 取石子小游戏(博弈)
- 种档胰屏赂腿堪兑槐耘灿
- HDU 2438 Turn the corner(三分)
- switch 和 if else的效率区别
- 热汉霉灿允勾痔刺亢糖淄
- 乙技槐账墙槐灿呕亚阂游
- 父览目傧谡目币屏欢冠僭
- 创爸礁胰旱游爬匚笛迟谡
- C语言编译全过程介绍