NOI2.5.6266採石ゲーム問題解(C++)


NOI2.5.6266採石ゲーム問題解(C++)
タイトル
6266:石取りゲーム
総Time Limit:1000 ms Memory Limit:65536 kB
Descriptionには石が2つあるので、二人で交代で取りに行きます.取るたびに、多くの石から取るしかなく、取る数は少ない石の数の整数倍でなければならない.最後に誰が石の山を空にすることができて、誰が勝っても勝つことができます.例えば最初の2つの石の数は25と7です
25 7-->11 7-->4 7-->4 3-->1 3-->1 0選手1取選手2取選手2取選手1取選手1取選手
最後に選手1(先取の)が優勝し、取る過程で選手2は唯一の取り方しかなかった.最初の時の石の数を指定して、もし二人とも最良の策略を取ったら、先手が勝つかどうか聞いてください.
Input入力には多数のデータが含まれています.各データのセットの1行は、2つの正の整数aとbを含み、初期の石の数を表す.入力は2つの0で終わります.
Outputは先手で勝てば「win」、そうでなければ「lose」を出力します
Sample Input 34 12 15 24 0 0
Sample Output win lose
Hintは、石の数が(a,b)でa>=bであると仮定する、[a/b]>=2であれば先手が必ず勝つ、[a/b]<2であれば先手は唯一の取り方しかない.[a/b]は、aをbで割る整数値を表す.
構想
この問題はヒントがあって、これはとても心地良くて、全体的に深く探して乾かしますで終わります
コード#コード#
#include
using namespace std;
int n,m;
void dfs(int a,int b,int step){//    ,a         ,b         ,step      
	if(a%b==0||a/b>=2){//    :    , a/b>=2     , a%b==0          ,     
	if(step%2==1){//  step        
		cout<<"win"<<endl;
		return;
	}else{//      
		cout<<"lose"<<endl;
		return;
	}
	}
	dfs(b,a%b,step+1);
	//            a ,a%b   a    b             
	// ,     b ,     a      
}

int main(){
	while(cin>>n>>m){
		if(n==0||m==0){
			return 0;//  n,m 0,    
		} 
		if(n<m){
			swap(n,m);//           n 
		}
		if(n/m>=2){//   
			cout<<"win"<<endl;
		}else{
			dfs(n,m,1);
		} 
	}
	return 0;
}