首页 > 代码库 > 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(博弈论入门题)