一道特别简单却错了的题。
棋盘问题
(a.cpp/c/pas)
【问题描述】mxjoe 学长有一个 n*m 的棋盘,每个格子只有可能是黑色或白色。
Oxer 和 mxjoe 在玩一个游戏,每次寻找一个边长为 x 的正方形,其中每个格
子必须为黑色,然后将这些格子染白。
如果谁不能操作了,那么那个人就输了。
Oxer 喜欢质数。
mxjoe 喜欢 1,但讨厌 2。
因此他们规定, x 只可能是非 2 质数或者是 1。
现在他们想知道,如果他们都用最优策略进行游戏,谁会赢?
上帝规定 Oxer 先手。
【输入格式】
第一行输入一个正整数 T,表示测试组数
对于每一个数据,
第一行包括两个正整数 n, m
接下来的 n 行,每行包括 m 个数字 0 或 1,若这个数为 1,则表示该位置为黑色,
否则为白色。
【输出格式】
共 n 行。
对于每一组数据,
输出“ Oxer”或者“ mxjoe”(不包含引号)。
【输入样例】
1
2 3
1 1 0
0 0 1
【输出样例】
Oxer
【数据范围及约定】
对于 30%的数据, 1<=n,m<=3,
对于另外 20%的数据, T=1,
对于 100%的数据, 1<=n,m<=100,1<=T<=10。
一眼看上去,感觉一个限制条件很奇怪:x 只可能是非 2 质数或者是 1。进行了一个大胆的猜想:拿一个和拿一个正方形没有区别。进行几次验算,发现确实如此,事后补上证明:因为非2质数和1都是奇数,拿走奇数个之后一定轮到对方拿,所以没有区别。
#include<bits/stdc++.h>
using namespace std;
int a[110][110];
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int t;
scanf("%d",&t);
while (t)
{
t--;
memset(a,0,sizeof(a));
int m,n,tot=0;
tot=0;
tot=0;
tot=0;
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[i][j]==1)
{
tot++;
}
}
}
if (tot%2==0)
{
printf("mxjoe\n");
}
else
{
printf("Oxer\n");
}
}
fclose(stdin);
fclose(stdout);
return 0;
}
重要的事情说三遍(代码已经说了),计数器一定要清零!!!