BZOJ2463[中山市選2009]誰能贏呢?——博弈論
阿新 • • 發佈:2018-12-19
題目描述
小明和小紅經常玩一個博弈遊戲。給定一個n×n的棋盤,一個石頭被放在棋盤的左上角。他們輪流移動石頭。每一回合,選手只能把石頭向上,下,左,右四個方向移動一格,並且要求移動到的格子之前不能被訪問過。誰不能移動石頭了就算輸。假如小明先移動石頭,而且兩個選手都以最優策略走步,問最後誰能贏?輸入
輸入檔案有多組資料。 輸入第一行包含一個整數n,表示棋盤的規模。 當輸入n為0時,表示輸入結束。輸出
對於每組資料,如果小明最後能贏,則輸出”Alice”, 否則輸出”Bob”, 每一組答案獨佔一行。
樣例輸入
20
樣例輸出
Alice提示
對於所有的資料,保證1<=n<=10000。 這道題許多人都猜結論或者手玩過了,但這裡還是給一下比較好理解的證明。 以n為奇數為例,去掉起始點還剩下偶數個點,一定存在一種方法能將剩下的偶數個點分成若干個1*2的長方形。 那麼對於每一輪操作,只要先手能走即先手能找到一個1*2的長方形,那麼後手就一定能從長方形的這一端走到那一端。#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"); } }