对于某个点(x,y),如果把这个点位置对应的行和列上每一个位置都进行一次操作(共7次操作),那么只有这个点变成了相反的点,其他点都不变,这个是可以证明的。你自己画一下就知道了。
然后对于每个‘+’,按照上面的操作搞一次,就可以把每个‘+’,都变成’-’。记录每个点被操作的次数。这时候肯定有的点不只是被操作了一次,因为一个点操作偶数次都等于不操作,奇数次就相当于操作一次,这时候历遍每个点的操作次数,把奇数变成1,偶数变成0,这就是答案。
#include <cstdio>
#include <cstring>
int mark[4][4];
char s[6][6];
int main() {
int ansi[16], ansj[16], cnt = 0;
memset(mark, 0, sizeof(mark));
for (int i = 0; i < 4; i++)
scanf("%s", s[i]);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
if (s[i][j] == '+') {
for (int k = 0; k < 4; k++) {
mark[i][k]++;
mark[k][j]++;
}
mark[i][j]--;
}
}
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
if (mark[i][j] % 2 == 1) {
ansi[cnt] = i + 1;
ansj[cnt++] = j + 1;
}
printf("%d\n", cnt);
for (int i = 0; i < cnt; i++)
printf("%d %d\n", ansi[i], ansj[i]);
return 0;
}