hdu 2177

4526 ワード

石取りゲーム
Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1101    Accepted Submission(s): 658
Problem Description
石が2つ積まれていて、数は任意で、異なってもいいです.ゲームは二人で交代で石を取り始めた.ゲームの規定では、毎回2つの異なる取り方があり、1つは任意の山の中で任意の石を取ることができる.二つ目は、二つの山の中で同じ数の石を同時に取り出すことができることです.最後に石を全部取った者を勝者とする.今、最初の2つの石の数を与えて、もしあなたが先に取る番になったら、双方が最高の策略を取って、最後にあなたが勝者なのか敗者なのかを聞いてみましょう.もしあなたが勝ったら、1回目はどうやって取りますか?
 
 
 
Input
入力はいくつかの行を含み、いくつかの石の初期状況を表し、各行は2つの非負の整数aおよびbを含み、2つの石の数を表し、aおよびbは100000を超えず、a<=bである.a=b=0で終了します.
 
 
Output
出力もいくつかの行があり、最後にあなたが敗者であれば0、逆に1を出力し、あなたを勝たせたあなたが1回目に石を取った後に残った2つの石の数x,y,x<=yを出力します.任意の一山の中から石を取り出すことで勝てると同時に同じ数の石を同時に取り出すことでも勝てる、同じ数の石を先に取り出す場合を出力する.
 
 
Sample Input
1 2
5 8
4 7
2 2
0 0
Sample Output
0
1
4 7
3 5
0
1
0 0
1 2
ウィゾフゲーム
#include
#include<string>
#include
#include
#include
#include
#include<set>
#include
#include
#include
#include
#include
using namespace std;
#define ll long long
int main(){
    int n,m;
    while(cin>>n>>m,n+m){
        if(n>m) swap(n,m);
        int k=m-n;
        if(int(k*1.0*(1+sqrt(5))/2)==n&&m==n+k){
            cout<<0<<endl;
            continue;
        }
        cout<<1<<endl;
        int a,b;
        for(int i=1;i<=n;i++)
            if(n-i==int(k*1.0*(1+sqrt(5))/2)&&m-i==n-i+k) cout<" "<endl;
        for(int j=m;j>=0;j--){
            a=n,b=j;
            if(a>b) swap(a,b);
            k=b-a;
            if(a==int(k*1.0*(1+sqrt(5))/2)&&b==a+k) cout<" "<endl;
}
}
}

 
転載先:https://www.cnblogs.com/ainixu1314/p/3931916.html