2463: [中山市选2009]谁能赢呢?
Description
小明和小红经常玩一个博弈游戏。给定一个n×n的棋盘,一个石头被放在棋盘的左上角。他们轮流移动石头。每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问过。谁不能移动石头了就算输。假如小明先移动石头,而且两个选手都以最优策略走步,问最后谁能赢?
Input
输入文件有多组数据。
输入第一行包含一个整数n,表示棋盘的规模。
当输入n为0时,表示输入结束。
Output
对于每组数据,如果小明最后能赢,则输出”Alice”, 否则输出”Bob”, 每一组答案独占一行。
Sample Input
2
0
0
Sample Output
Alice
HINT
对于所有的数据,保证1<=n<=10000。
题意:给定n,n×n的棋盘,一个石头放在左上角,两个人轮流移动石头,每次把石头向上,下,左,右四个方向移动一格,要求移动到的格子之前不能被访问过,不能移动石头就算输,两人都用最优策略,问先手胜还是后手胜。
https://www.lydsy.com/JudgeOnline/problem.php?id=2463
首先对于n是偶数,先手胜;n是奇数,后手胜
用1*2骨牌覆盖棋盘。
n为偶数时一定可以覆盖,每次先手走前一步所在骨牌另一端,先手必胜。
n为奇数时去掉左上角第一格一定能被骨牌覆盖,但是先手从左上角走,必须走到一个没有走过的骨牌内,每次后手走前一步所在骨牌另一端,后手必胜。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<vector> 7 8 using namespace std; 9 10 template <typename tn> void read (tn & a) { 11 tn x = 0, f = 1; 12 char c = getchar(); 13 while (c < '0' || c > '9'){ if (c == '-') f = -1; c = getchar(); } 14 while (c >= '0' && c <= '9'){ x = x * 10 + c - '0'; c = getchar(); } 15 a = f == 1 ? x : -x; 16 } 17 18 int main() { 19 int n; 20 read(n); 21 while (n) { 22 if (n % 2 == 0) { 23 printf("Alice\n"); 24 } 25 else { 26 printf("Bob\n"); 27 } 28 read(n); 29 } 30 return 0; 31 }