HDU2177——取(2堆)石子游戲(威佐夫博弈)

題目鏈接

       這道題是HDU1527的升級版,題意都好懂,是威佐夫博弈的一道模板題,如果不是很瞭解威佐夫博弈,可以看一看我寫的HDU1527的博客,我大致陳述了威佐夫博弈的一些基本知識,有助於解決此題。這道題目就是判斷了當前狀態爲非奇異局勢的時候如何拿走石頭使其成爲奇異局勢,由於數據範圍在可接受範圍之內,所以先吧0<=k<=1000000的奇異局勢存在vis數組內然後,對於所有可能的更改進行暴力找出複合條件的奇異局勢即可。


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

int vis[1000005]= {0};

int main()
{
    //freopen("in.in","r",stdin);
    //freopen("out.out","w",stdout);
    for(int i=1; i<1000005; i++)
        vis[i]=(int)(i*1.0*(1+sqrt(5))/2);
    int n, m;
    while(scanf("%d%d",&n,&m)&&(n||m))
    {
        int k=m-n;
        if(vis[k]==n)
        {
            printf("0\n");
            continue;
        }
        printf("1\n");
        if(n>vis[k]&&m>vis[k]+k)
            printf("%d %d\n",vis[k],vis[k]+k);
        for(int i=1; i<1000005; i++)
            if(vis[i]==n)
            {
                if(m>vis[i]+i)
                    printf("%d %d\n",vis[i],vis[i]+i);
                break;
            }else if(vis[i]==m)
            {
                if(n>vis[i]+i)
                    printf("%d %d\n",vis[i],vis[i]+i);
                break;
            }
        for(int i=1; i<1000005; i++)
            if(vis[i]+i==m)
            {
                if(n>vis[i])
                    printf("%d %d\n",vis[i],vis[i]+i);
                break;
            }else if(vis[i]+i==n)
            {
                if(m>vis[i]+i)
                    printf("%d %d\n",vis[i],vis[i]+i);
                break;
            }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章