POJ 2965
- 一个开关按偶数次等于没有改变状态,只有奇数次才会改变状态
如果把一个关闭的开关及其所在列和所在行的开关全部按一遍,因为是\(4\times 4\) 的网格,每个开关在行或者列就会被影响偶数次,等于没有改变他的状态,只有当前的开关会被改变状态,因为当前的开关被周围影响了\(6\) 次,自己再按一次,正好改变了状态。
我们对每一个关闭的开关都执行一次这种操作,最后图中剩余的\(1\) 就是不可避免的操作次数(没有被这个过程抵消掉的操作次数)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 6;
int g[N][N];
int main() {
char ch;
int ans = 0;
for(int i = 0;i < 4; ++i) {
for(int j = 0;j < 4; ++j) {
cin >> ch;
if(ch == '+') {
g[i][j] ^= 1;
for(int k = 0;k < 4; ++k) {
g[i][k] ^= 1;
g[k][j] ^= 1;
}
}
}
}
for(int i = 0;i < 4; ++i) {
for(int j = 0;j < 4; ++j) {
if(g[i][j]) ans ++;
}
}
cout << ans << endl;
for(int i = 0;i < 4; ++i) {
for(int j = 0;j < 4; ++j) {
if(g[i][j]) cout << i + 1 <<' ' << j + 1 << endl;
}
}
return 0;
}
参考