二进制矩阵

题目传送门

题意:有一种操作可使\(2×2\)的矩阵中任意三个数进行~操作(0变1,1变0)
易得,操作如果对同一数进行了偶数次,数不变,奇数次变
再加上有操作次数限制,\(3*n*m\)次操作
那么把每个数,都操作三次,其他数都操作两次,即可使矩阵任一一数0变为1,1变为0

举个例子


蓝色绿色紫色覆盖的格子分别不同的三次操作

除了黑圈圈出的格子,都没有发生改变

  • code
#include<cstdio>
using namespace std;
int t;
int n,m;
int ans=0;
const int maxn=1e2+10;
bool mp[maxn][maxn];
void pr(int i,int j,int op){
    if(op==1) printf("%d %d %d %d %d %d\n",i,j,i+1,j,i,j+1);
    else if(op==2)  printf("%d %d %d %d %d %d\n",i,j,i,j-1,i+1,j); 
    else if(op==3)  printf("%d %d %d %d %d %d\n",i,j,i-1,j,i,j-1);
    else printf("%d %d %d %d %d %d\n",i,j,i-1,j,i,j+1);
}
int main(){
    scanf("%d",&t);
    while(t--){
        ans=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i){
            char c[maxn];
            scanf("%s",c+1);
            for(int j=1;j<=m;++j){
                mp[i][j]=c[j]-'0';
                if(mp[i][j]) ++ans;
            } 
        }
        printf("%d\n",ans*3);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j){
                if(mp[i][j]){
                    if(i<n && j<m) {
                        pr(i,j,1),pr(i,j+1,2);pr(i+1,j,4);
                    }
                    else if(i==n && j==m){
                        pr(i,j,3);pr(i-1,j,2);pr(i,j-1,4);
                    }
                    else if(i==n){
                        pr(i,j,4);pr(i-1,j,1);pr(i,j+1,3);
                    }
                    else {
                        pr(i,j,2);pr(i,j-1,1);pr(i+1,j,3);
                    }
                }
            }
    }return 0;
}
posted @ 2021-08-14 18:19  归游  阅读(320)  评论(0编辑  收藏  举报