HDU 4146 Flip Game
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4146
这一题简单的想去,思路很简单,输入一个坐标后,该座标所在的行和列的方块都要反转,初始的话是直接法,用for循环遍历,结果果然超时了。后来上网看看发现可以利用每组反转次数的奇偶性来判断,倒也挺新鲜。还涉及到一个异或运算符,倒是用来判断奇偶次数的好运算符。不过由于只出现0或1来记录奇偶性,可以直接设为0,翻一次该列或行的标记值就更新为1-0,变为1,再翻在更新为1-1,为0,因此偶数次就是0,奇数次就是1。翻偶数次的不变,奇数次的变。
**问题:**一个是输入字符数组时出现问题,如果一个一个字符输入的话,输出时会出现问题。详见大佬 博客
因此如果你用scanf进行输入没报错的话就用scanf进行输入,但在msvs2015中要用scanf_s("%s",str,N+1) 进行输入,但是提交过不了,在提交时改为scanf("%d",str)就ac了,但在编译器上是输入不了的,真奇怪,路过的dalao如果搞懂了请告诉我,感激不尽。
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
char a[1001][1001];
int x[1001];
int y[1001];
int Case = 1;
int main()
{
int t,N,Q,m,n;
scanf_s("%d", &t);
while (t--)
{
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
scanf_s("%d", &N);
for (int i = 0; i<N; i++)
{
scanf("%s", a[i],N+1); // 编译器能过但提交时要修改
}
scanf_s("%d", &Q);
for (int i = 0; i<Q; i++)
{
scanf_s("%d %d", &m, &n);
m--, n--;
x[m] = 1 - x[m];
y[n] = 1 - y[n];
}
int cnt = 0;
for (int i = 0; i<N; i++)
{
for (int j = 0; j<N; j++)
{
if (x[i] + y[j] == 1)
{
if (a[i][j] == 'b') cnt++;
}
else
{
if (a[i][j] == 'w') cnt++;
}
}
}
printf_s("Case #%d: %d\n",Case++,cnt);
}
return 0;
}