题意 给你4*4的冰箱把手打开情况 问你几步可以把冰箱把手全变成打开 翻转一个位置会导致该行该列的值都翻转
我们如何考虑这题 我们知道如果同一列的两个数同时翻转 那么这一列会只翻转这两个数 同一行也同理
也就是row[i] + col[j]如果是奇数 就会翻转i j 点 如果是偶数 就不会翻转 所以我们想要把所有的'+'变成'-' 对输入的 '+'我们必须要进行翻转操作 在另一个数组中打上res 代表这行这列被翻转了 然后对所有res为1也就是奇数 代表必须再翻转 回来 因为是奇数翻转一次是偶数 对其他人无影响 也就是弥补我们之前的操作
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <sstream>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
char str[15][15];
int res[15][15];
int main()
{
for(int i = 1;i<=4;++i){
for(int j = 1;j<=4;++j)
scanf("%c",&str[i][j]);
getchar();
}
int ans = 0;
for(int i = 1;i<=4;++i)
for(int j = 1;j<=4;++j)
if(str[i][j]=='+'){
for(int k = 1;k<=4;++k)
res[i][k]^=1,res[k][j]^=1;
res[i][j]^=1;
}
for(int i = 1;i<=4;++i)
for(int j = 1;j<=4;++j)
if(res[i][j]){
ans++;
}
printf("%d\n",ans);
for(int i = 1;i<=4;++i)
for(int j = 1;j<=4;++j){
if(res[i][j]) printf("%d %d\n",i,j);
}
return 0;
}