【不明出处】 棋盘问题

来源:互联网 发布:算法统宗 以碗知僧 编辑:程序博客网 时间:2024/04/28 14:23

一道特别简单却错了的题。


棋盘问题
(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;}

重要的事情说三遍(代码已经说了),计数器一定要清零!!!




原创粉丝点击