题意:在一个矩阵中放着可上可下的银币,你可以翻一个矩形里面的银币使它们变成相反的方向,但此矩型必须是右下角是矩阵的最右下角,左上角这个点必须是朝上的。最 后结束的标志是所有的银币都已经都是朝上的,此时游戏结束。
思路:首先游戏是会结束的。假设最右下角的是1(其他都是0)那显然第一个人赢了。假设其他还有1那么第一个人最优的是把右下角的这一枚银币组成的矩形,这样使得它变成0。另一个人只能翻外面的1,不管他怎么翻,这个矩阵的1都会在变小[因为假设他翻的最左上的1,那这个位置不能再变成0,变小了。假设他翻的不是最左上的1,那他翻的1也不能再变成1,如你要把它重变成1,你又必须去翻最左上角的].so得证。而第一个人只要不断的把右下角的1变成0,最后就能取胜。
反之,同理。#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int xx=1e3;
int a[xx][xx];
int main()
{
int T,N,M;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &N, &M);
for(int i =1; i<=N; i++)
for(int j =1; j<=M; j++)
scanf("%d", &a[i][j]);
if(a[N][M])
puts("Alice");
else
puts("Bob");
}
return 0;
}