POJ - 2348 Euclid's Game(博弈论入门题)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ - 2348 Euclid's Game(博弈论入门题)相关的知识,希望对你有一定的参考价值。
题意:给出两个数,两个人进行博弈,每个人都采取最优策略。
每个人可以进行操作:两个数中较大数减去较小数的倍数(可以是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(博弈论入门题)的主要内容,如果未能解决你的问题,请参考以下文章
POJ - 2348 Euclid's Game(博弈论入门题)