歐幾里得游戲(博弈論啟蒙)


題目描述

小明和小紅在玩歐幾里得游戲。他們從兩個自然數開始,第一個玩家小明,從兩個數的較大數中減去較小數的盡可能大的正整數倍,只要差為非負即可。然后,第二個玩家小紅,對得到的兩個數進行同樣的操作,然后又是小明。就這樣輪流進行游戲,直至某個玩家將較大數減去較小數的某個倍數之后差為0為止,此時游戲結束,該玩家就是勝利者。

輸入

輸入包含多組測試數據。每組輸入兩個正整數,表示游戲一開始的兩個數,游戲總是小明先開始。
當輸入兩個0的時候,輸入結束。

輸出

對於每組輸入,輸出最后的勝者,我們認為他們兩個都是頂尖高手,每一步游戲都做出了最佳的選擇。
具體輸出格式見輸出樣例。

樣例輸入

34 12
15 24
0 0

樣例輸出

xiaoming wins
xiaohong wins

兩句話,能轉移到必敗點的是必勝點,只能轉移到必勝點的是必敗點。

我是這么推出來的,或者從定理出發,一個點不是必敗點就是必勝點,對三角形右下角分別假設,都可以推出m/n>2必勝

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
int main(){
    while(scanf("%d%d",&n,&m)==2&&n&&m){
        if(n>m) swap(n,m);
        bool flag=true;
        while(m%n!=0&&m/n==1){
            m-=n;
            if(n>m) swap(n,m);
            flag=!flag;
        }
        if(flag){
            printf("xiaoming wins\n");
        }
        else printf("xiaohong wins\n");
    }
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM