Alice and Bob
30000ms
1000ms
65536KB
我不知道Alice和Bob到底发展到了哪一阶段,就像我不知道李雷最后有没有负了韩梅梅,同样的我也不知道奶牛Bessie是否逃出了Farmer John魔爪。撇开这些八卦不说,取石子游戏绝对是一款风靡ACM界的经典游戏,虽然我完全无法理解为什么每次Alice和Bob都能找到最佳策略却还对这种开玩之前就知道结果的游戏这么有兴趣……
好吧…今天这二位又开始玩了……
现在有一个N*M的棋盘,棋盘每个格子上都有着若干块石子。Alice和Bob轮流进行游戏,每次进行游戏的一方需要选择一个非空的格子,然后从这个格子中拿走任意数量(但不能为零)的石子,然后将拿走的石子全部放到这个格子的右上或右下的格子中(二选一)。即是说将石子从(x,y)移到(x+1,y+1)或(x-1,y+1)。若要移到的格子在棋盘之外,则这一步操作为非法操作,需重新选格子进行操作。当有人无法做出合法操作时游戏结束,不能移动的一方输掉比赛。每次由Alice先进行操作。现在给出棋盘的初始状态,假设双方都采取最好的策略,问谁将赢得游戏。
Input
输入的第一行为两个正整数N和M(1≤N*M≤50000)。接下来的N行每行M个非负整数表示初始时这个格子上的石子数(每个数都在128以内)。
Output
输出"Alice"或"Bob"表示游戏获胜的一方。
Sample Input
2 2 2 2 1 2
Sample Output
Alice
Source
Author
temperlsyer
必胜列 必败列(m-1)
可以很清晰的找到一些特殊的情况,比如n==1和m==1的情况,很明显,这种情况游戏完全无法发生,所以Bob赢
接下来,可以发现,在m-1列,也就是最后一列,如果有人(不管是alice还是Bob,只关注当前的先手)那么肯定输了,因为根本不能走啊~
同样的,那m-2列,必定可以,而且只可以,走到下一列,也就是必定能走,那么,对每一个单独的格子而言,必胜。
所以,同样的,只需要考虑每一个m-2,m-4,.....接下来跟NIM就差不多了~
必胜列 必败列(m-1)
接下来,可以发现,在m-1列,也就是最后一列,如果有人(不管是alice还是Bob,只关注当前的先手)那么肯定输了,因为根本不能走啊~
同样的,那m-2列,必定可以,而且只可以,走到下一列,也就是必定能走,那么,对每一个单独的格子而言,必胜。
所以,同样的,只需要考虑每一个m-2,m-4,.....接下来跟NIM就差不多了~
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
int main()
{
int n,m;
int x;
while(cin>>n>>m)
{
if(n==1||m==1)
{
for(int i=0;i<n;i++)
for(int i=0;i<m;i++)
scanf("%d",&x);
printf("Bob\n");
}
else
{
int f=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&x);
if((m-j)%2==0)
{
f^=x;
}
}
}
if(f)
printf("Alice\n");
else
printf("Bob\n");
}
}
return 0;
}