来源:点击打开链接
看上去很难,比赛的时候光看hehe了,也没有想。
但是仔细想想,是可以想出来的。一个棋盘上每个格子摆放一个硬币,硬币有正面1和反面0之分。现在两个人可以按照规则翻硬币,选择(x,y),要求(x,y)的硬币必须是正面,那么从(x,y)向右下角所有的硬币都被翻转。知道某个人无法翻(所有硬币都是反面)为止,这个人判输。
有一种特殊情况,那就是右下角,每次都被反转。
无论如何翻,如果右下角开始的是1,则Alice赢,反之后手赢。因为其他的硬币不论怎么翻,右下角的硬币永远是这样,所以其他的策略不重要。明白了这一点,这个题就水爆炸了。
#include <iostream> #include <cstring> #include <cstdio> #include <string> using namespace std; int mat[109][109]; int main() { int testcase; cin>>testcase; while(testcase--) { memset(mat,0,sizeof(mat)); int n,m; cin>>n>>m; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) scanf("%d",&mat[i][j]); } if(mat[n-1][m-1]==1) cout<<"Alice"<<endl; else cout<<"Bob"<<endl; } return 0; }