1. 程式人生 > >取石子遊戲

取石子遊戲

size cst 數據 php log 最優 時間限制 題目 初始

取石子遊戲

鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1218


時間限制: 1000 ms 內存限制: 65536 KB

【題目描述】

有兩堆石子,兩個人輪流去取。每次取的時候,只能從較多的那堆石子裏取,並且取的數目必須是較少的那堆石子數目的整數倍,最後誰能夠把一堆石子取空誰就算贏。

比如初始的時候兩堆石子的數目是25和7。

25 7 --> 11 7 --> 4 7 --> 4 3 --> 1 3 --> 1 0

選手1取 選手2取 選手1取 選手2取 選手1取

最後選手1(先取的)獲勝,在取的過程中選手2都只有唯一的一種取法。

給定初始時石子的數目,如果兩個人都采取最優策略,請問先手能否獲勝。

【輸入】

輸入包含多數數據。每組數據一行,包含兩個正整數a和b,表示初始時石子的數目。

輸入以兩個0表示結束。

【輸出】

如果先手勝,輸出"win",否則輸出"lose"

【輸入樣例】

34 12
15 24
0 0

【輸出樣例】

win
lose

題解:

假設石子數目為(a,b)且a >= b,如果[a/b] >= 2則先手必勝,如果[a/b]<2,那麽先手只有唯一的一種取法,此時交換兩人順序。[a/b]表示a除以b取整後的值。

#include<iostream>
#include
<cstdio> using namespace std; int check(int m,int n) { if(m<n)return check(n,m); if(m/n>=2)return 1; else return !check(m-n,n); } int main(){ int m,n; while(cin>>m>>n) { if(!m&&!n)break; if(check(m,n))cout<<"win"<<endl;
else cout<<"lose"<<endl; } }

取石子遊戲