2020 CCPC-Wannafly Winter Camp Day3 Div.1&2(E 棋技哥)(找规律-博弈论)
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
火山哥和鸡老八在下棋。
这张棋盘是
n
×
m
n\times m
n×m 的。每一个格子要么是黑色的,要么是白色的。
两个人轮流进行操作。火山哥先手。每一次可以选择一个黑色的格子,以这个格子为右下角,棋盘左上角为左上角,将这个矩阵的所有格子的颜色由黑变成白,由白变成黑。如果找不到一个黑色的格子,那么那个人就输了。
现在两个人都想让火山哥赢,请问谁能赢呢。
输入描述:
第一行一个整数
T
{T}
T ,表示有
T
{T}
T 组数据。
每组数据第一行两个整数
n
,
m
{n,m}
n,m ,表示棋盘的大小。
接下来
n
{n}
n 行每行
m
{m}
m 个字符
0
0
0(白色)或者
1
1
1(黑色),描述了这个棋盘的初始状态。
1
≤
n
,
m
≤
500
,
1
≤
T
≤
20
1\le n,m\le 500 ,1\le T\le 20
1≤n,m≤500,1≤T≤20
输出描述:
对于每组的每个询问,输出一行,如果火山哥赢输出“call”
,鸡老八赢输出“aoligei”
(不含引号)。
示例1
输入
3
2 2
11
11
3 2
01
10
11
2 2
00
11
输出
call
aoligei
aoligei
题解
脑筋急转弯
膜拜大神:蒟蒟独行
事实上只需要看左上角第一个方块的状态即可得出结论!
因为每次翻转必会改变左上角第一个方块的状态,所以对于对弈双方来说,其相对于左上角的方块的状态是不可改变的!
因此,只要左上角是黑色的,先手就必赢!
代码
#include<bits/stdc++.h>
using namespace std;
int T, n, m, i;
char s[502];
int main() {
scanf("%d", &T);
for (; T--;) {
scanf("%d%d", &n, &m);
scanf("%s", s + 1);
puts(s[1] == '1' ? "call" : "aoligei");
for (i = 1; i < n; i++) scanf("%s", s + 1);
}
}