首页 > 代码库 > POJ - 2348 Euclid's Game(博弈论入门题)
POJ - 2348 Euclid's Game(博弈论入门题)
题目链接:poj.org/problem?id=2348
题意:给出两个数,两个人进行博弈,每个人都采取最优策略。
每个人可以进行操作:两个数中较大数减去较小数的倍数(可以是1,2...X倍),使得其中一个数先为零的获胜。
每次都先把较小值给a,较大值给b。一开始把必胜态给先手的那个人,然后进行判断。
1.b-a<=a 没办法只能一次一次计算,必胜态不断变换,直到其中一个数刚好为0。
2.b-a>a 不管怎样都是必胜态。b - xa <= a如果这个是必败态,那么b - (x-1)a > a这个为必胜态。
举个例子:(4,17)———(4,1)必败
(4,17)———(4,5)———(4,1)必胜
(4,19)———(4,3)———(1,3)必胜
(4,19)———(4,7)———(4,3)———(1,3)必败
简单说来就是b-a>a的时候可以通过判断尽量减是否能为必胜态,能的话就直接操作,不能的话再保留一个数,让对手去减,消耗,留下的就是必胜态了。
可以说能够立于不败之地。
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 int main(){ 6 int a,b; 7 while(cin>>a>>b){ 8 if(a==0&&b==0) break; 9 bool T=true;10 while(1){11 if(a>b) swap(a,b);12 if(b%a==0) break;13 if(b-a>a) break;14 b-=a;15 T=!T;16 }17 if(T) cout<<"Stan wins"<<endl;18 else cout<<"Ollie wins"<<endl;19 }20 return 0;21 }
POJ - 2348 Euclid's Game(博弈论入门题)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。