^m
路漫漫

2463: [中山市选2009]谁能赢呢?

Description

 
小明和小红经常玩一个博弈游戏。给定一个n×n的棋盘,一个石头被放在棋盘的左上角。他们轮流移动石头。每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问过。谁不能移动石头了就算输。假如小明先移动石头,而且两个选手都以最优策略走步,问最后谁能赢?
 

Input

    输入文件有多组数据。
    输入第一行包含一个整数n,表示棋盘的规模。
    当输入n为0时,表示输入结束。
 

 

Output

对于每组数据,如果小明最后能赢,则输出”Alice”, 否则输出”Bob”, 每一组答案独占一行。

Sample Input

2

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 } 
View Code

 

posted on 2018-04-12 22:43  ^m  阅读(117)  评论(0编辑  收藏  举报