链接:http://poj.org/problem?id=2965
思路:利用总共的状态只有六万多的特点,我们可以用dfs暴力枚举。不过这里我们换用另一种方法。注意到碰到+号时,将该点的所在行和所在列的每一个点翻转。这样改点翻了七次,该行该列所在点反转了四次,其余是两次。 只有该+点变化了。利用这个性质我们对每一个+进行该操作。再对反转的点进行分析,反转为偶数的就不需要考虑了。剩下的就是答案。(注意到如果是3*3的矩阵这招就不灵了,5*5也是)。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int mapp[5][5];
void fuc(int r, int c);
int main()
{
int i,j;
char ch;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
{
cin>>ch;
if(ch == '+')
fuc(i,j);
}
int ans = 0;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
if(mapp[i][j]%2!=0)
ans++;
cout<<ans<<endl;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
if(mapp[i][j]%2!=0)
cout<<i+1<<" "<<j+1<<endl;
return 0;
}
void fuc(int r, int c)
{
for(int i=0; i<4; i++)
{
mapp[r][i]++;
mapp[i][c]++;
}
mapp[r][c]--;
}