HDU 1527 取石子游戏 (博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527

题       意:有两堆石子,不妨先认为一堆有 10,另一堆有 15 个,双方轮流取走一些石子,合法的取法有如下两种:
                           1、在一堆石子中取走任意多颗;
                           2、在两堆石子中取走相同多的任意颗;
                  约定取走最后一颗石子的人为赢家,求必胜策略。

思      路:运用威佐夫博奕的规律,代入计算即可。(威佐夫博奕)

代码如下:

#include 
using namespace std;
#include 
#include 
#include 
#include 
int main()
{
    int n, m;
    double sq = ( sqrt(5.0) + 1 ) / 2;
    while( scanf ( "%d %d", &n, &m ) != EOF )
    {
        if( n < m )
        {
            int t = n;//交换n,m
            n = m;
            m = t;
            /*n^=m;//这样也可以
            m^=n;
            n^=m;*/
        }
        int k = n - m;
        if( m == (int)(k*sq) )
        {
            printf("0\n");
        }
        else printf("1\n");
    }
    return 0;
}


 

你可能感兴趣的:(博弈)