【POJ3190】The Pilots Brothers' refrigerator

题意

给定4*4矩阵,把所有的“+”变为“-”,每次修改一个点,将修改与这个点同一行同一列的所有点。

分析

有结论:修改一个点,则修改与这个点同一行同一列的所有点(包括这个点),而图中其他所有点都不会被修改,为什么呢?


      4 4 4 4
      ↓ ↓ ↓ ↓    
--> 7 0 0 0 0
--> 4 0 0 0 0
--> 4 0 0 0 0
--> 4 0 0 0 0

假设要修改第一行第一列,则按上述方式,周围一圈的点修改的次数就像图上标的。图内其他点都被修改2次

所以只有要修改的那个店是奇数次修改,其他点相当于没有修改

那我们只需要枚举每个“+”,进行结论的修改操作,然后统计哪些点被修改的次数是奇数次(xor n次后答案是1)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define N 110
int cnt;
int a[20][20],color[N*N][2];
char s[N];
int main()
{
    for(int i=1;i<=4;i++)
    {
        scanf("%s",s+1);
        for(int j=1;j<=4;j++)
        {
            if(s[j]=='+')
            {
                a[i][j]^=1;
                for(int k=1;k<=4;k++)
                    a[i][k]^=1,a[k][j]^=1;
            }
        }            
    }
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
            if(a[i][j])
                cnt++,color[cnt][0]=i,color[cnt][1]=j;
    printf("%d
",cnt);
    for(int i=1;i<=cnt;i++)
        printf("%d %d
",color[i][0],color[i][1]);
    return 0;
}
“Make my parents proud,and impress the girl I like.”
原文地址:https://www.cnblogs.com/NSD-email0820/p/9601317.html