二进制矩阵
题目传送门
题意:有一种操作可使\(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;
}