威佐夫博弈基础2
来源:互联网 发布:cg软件 编辑:程序博客网 时间:2024/05/17 23:13
题目:hdu2177
题意:有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。如果你胜,你第1次怎样取子?
解答:如果满足必败态,输出0。否则。首先考虑从两堆里同时拿,这种情况它的差值不变,则根据差值计算较小的那个值,如果可以变成那种情况则输出。接下来 考虑拿其中一堆使其满足条件。枚举差。范围0到b。如果算出来较小的值等于a则改变b,如果算出来较大的值等于b则改变a,如果算出来较大值等于a则改变b.注 意不要忽略了第三种情况。
#include<iostream>#include<cstdio>#include<cmath>using namespace std;int main(){ int a,b; while(~scanf("%d%d",&a,&b)) { if(a == 0 && b == 0) break; int t; int d = b - a; int tmp = floor(d*(sqrt(5.0)+1)/2); if(tmp == a) printf("0\n"); else { printf("1\n"); int tmpb,tmpa; if(a > tmp) { if(b - a + tmp >= 0) tmpb = b - a + tmp; tmpa = tmp; if(tmpb >= tmpa) printf("%d %d\n",tmpa,tmpb); } for(int i = 0;i <= b;i++) { int temp = floor(i * (1 + sqrt(5.0))/2); if(i == b-a) continue; if(temp == a) { if(temp + i < b) printf("%d %d\n",a,temp+i); } if(temp+i == b) { if(temp < a) printf("%d %d\n",temp,temp+i); } if(temp+i == a && a!=b && i != 0)/// { if(temp < b) printf("%d %d\n",temp,temp + i); } } } } return 0;}
0 0
- 威佐夫博弈基础2
- 威佐夫博弈基础
- 巴什博弈基础2
- 基础博弈
- 博弈基础
- 博弈基础
- 基础博弈
- 博弈基础
- 51nod1072---威佐夫博弈(51nod基础:博弈)
- 基础博弈—Nim博弈
- 基础博弈—Nim博弈
- 博弈-威佐夫博弈
- 威佐夫博弈 && Fibonacci博弈
- 组合博弈基础
- 基础博弈总结
- 基础博弈小结
- hdoj博弈基础题
- 三大基础博弈
- linux tcp
- Mysql_学习记录
- 关于(function(){})()
- Android Studio中利用JavaDoc生成项目API文档
- java学习之路 之 IO流
- 威佐夫博弈基础2
- UVA12627 Erratic Expansion
- 【lightoj1331】Agent J【计算几何】
- 多态
- 白底黑字!Android浅色状态栏黑色字体模式
- Android集成高德地图
- JavaBean
- 复习统计(2)-统计量的抽样分布
- 常用快捷键 特别是格式化代码ctrl+i