POJ - 2348 Euclid's Game(博弈论入门题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(博弈论入门题)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2348 Euclid's Game 博弈论

poj2348 Euclid's Game

POJ - 2348 Euclid's Game(博弈论入门题)

POJ 2348 Euclid's Game(博弈)题解

POJ 2348 Euclid's Game(辗转相除博弈+自由度分析)

Euclid's Game