1. 程式人生 > >BZOJ2463[中山市選2009]誰能贏呢?——博弈論

BZOJ2463[中山市選2009]誰能贏呢?——博弈論

題目描述 

小明和小紅經常玩一個博弈遊戲。給定一個n×n的棋盤,一個石頭被放在棋盤的左上角。他們輪流移動石頭。每一回合,選手只能把石頭向上,下,左,右四個方向移動一格,並且要求移動到的格子之前不能被訪問過。誰不能移動石頭了就算輸。假如小明先移動石頭,而且兩個選手都以最優策略走步,問最後誰能贏?

輸入

    輸入檔案有多組資料。     輸入第一行包含一個整數n,表示棋盤的規模。     當輸入n為0時,表示輸入結束。

輸出

對於每組資料,如果小明最後能贏,則輸出”Alice”, 否則輸出”Bob”, 每一組答案獨佔一行。

樣例輸入

2
0

樣例輸出

Alice

提示

對於所有的資料,保證1<=n<=10000。   這道題許多人都猜結論或者手玩過了,但這裡還是給一下比較好理解的證明。 以n為奇數為例,去掉起始點還剩下偶數個點,一定存在一種方法能將剩下的偶數個點分成若干個1*2的長方形。 那麼對於每一輪操作,只要先手能走即先手能找到一個1*2的長方形,那麼後手就一定能從長方形的這一端走到那一端。
所以只要先手能走後手一定能走,後手必勝。 對於n為偶數的情況同理。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n;
int main()
{
    while(1)
    {
        scanf("%d",&n);
        if(n==0)
        {
            return 0;
        }
        printf((n&1)==0?"Alice\n":"Bob\n");
    }
}