Descrição do título: clique para entrar
Título
Fornece uma tabela binária de tamanho n × m. Esta tabela consiste no símbolo 0 e no símbolo 1.
Você pode fazer isso:
selecione 3 células diferentes que pertencem a um quadrado 2 × 2 e altere os símbolos nessas células (altere 0 para 1 e 1 para 0).
Sua tarefa é fazer com que todos os símbolos da tabela sejam iguais a 0. Você pode realizar até nm operações.
Você não precisa minimizar o número de operações.
Ideias
Esta é uma versão aprimorada da pergunta anterior . O número de operações mudou para nm. O código que eu tinha da última vez estava problemático e eu não tive escolha a não ser otimizá-lo, mas foi apenas um pouco de otimização para o processamento de fronteira, mas foi mágico (magia mágica, nas palavras do irmão xy Em outras palavras, ele pode ser destilado.)
Otimização: Quando o limite é avaliado, todo o retângulo 2 * 2 contendo o limite é alterado para apenas a linha de limite, o que pode reduzir o número de operações.
Código
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define INF 0x3f3f3f3f
#define pii pair<int, int>
//#define pdi pair<double,int>
//#define int long long
using namespace std;
typedef long long ll;
typedef unsigned long long llu;
const int maxn=1e5+10;
const int mod=1000000007;
int t,n,k,m,tot;
vector<int>ax;
vector<int>ay;
char a[110][110];
int check(int x,int y)
{
int sum=0;
for(int i=x;i<=x+1;i++)
{
for(int j=y;j<=y+1;j++)
{
if(a[i][j]=='0')
sum++;
}
}
return sum;
}
void check1(int x,int y)
{
for(int i=x;i<=x+1;i++)
{
for(int j=y;j<=y+1;j++)
{
if(a[i][j]=='1')
{
ax.push_back(i);
ay.push_back(j);
a[i][j]='0';
}
}
}
}
void check2(int x,int y)
{
int flag=1;
for(int i=x;i<=x+1;i++)
{
for(int j=y;j<=y+1;j++)
{
if(a[i][j]=='0'||a[i][j]=='1'&&flag)
{
if(a[i][j]=='1') flag--;
ax.push_back(i);
ay.push_back(j);
if(a[i][j]=='0') a[i][j]='1';
else a[i][j]='0';
}
}
}
check1(x,y);
}
void check3(int x,int y)
{
int flag=2;
for(int i=x;i<=x+1;i++)
{
for(int j=y;j<=y+1;j++)
{
if(flag&&a[i][j]=='0'||a[i][j]=='1')
{
if(a[i][j]=='0') flag--;
ax.push_back(i);
ay.push_back(j);
if(a[i][j]=='0') a[i][j]='1';
else a[i][j]='0';
}
}
}
check2(x,y);
}
void check0(int x,int y)
{
int flag=3;
for(int i=x;i<=x+1;i++)
{
for(int j=y;j<=y+1;j++)
{
if(flag)
{
flag--;
ax.push_back(i);
ay.push_back(j);
a[i][j]='0';
}
}
}
check3(x,y);
}
int main( )
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
ax.clear();
ay.clear();
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
if(m&1)
{
for(int i=1;i<=n-1;i+=2)
{
int cnt=0;
if(a[i][m]=='1')
{
cnt++;
a[i][m]='0';
ax.push_back(i);
ay.push_back(m);
}
if(a[i+1][m]=='1')
{
cnt++;
a[i+1][m]='0';
ax.push_back(i+1);
ay.push_back(m);
}
if(cnt==0) continue;
else if(cnt==1)
{
if(a[i][m-1]=='0') a[i][m-1]='1';
else a[i][m-1]='0';
ax.push_back(i);
ay.push_back(m-1);
if(a[i+1][m-1]=='0') a[i+1][m-1]='1';
else a[i+1][m-1]='0';
ax.push_back(i+1);
ay.push_back(m-1);
}
if(cnt==2)
{
if(a[i][m-1]=='0') a[i][m-1]='1';
else a[i][m-1]='0';
ax.push_back(i);
ay.push_back(m-1);
}
}
}
if(n&1)
{
for(int j=1;j<=m-1;j+=2)
{
int cnt=0;
if(a[n][j]=='1')
{
cnt++;
a[n][j]='0';
ax.push_back(n);
ay.push_back(j);
}
if(a[n][j+1]=='1')
{
cnt++;
a[n][j+1]='0';
ax.push_back(n);
ay.push_back(j+1);
}
if(cnt==0) continue;
else if(cnt==1)
{
if(a[n-1][j]=='0') a[n-1][j]='1';
else a[n-1][j]='0';
ax.push_back(n-1);
ay.push_back(j);
if(a[n-1][j+1]=='0') a[n-1][j+1]='1';
else a[n-1][j+1]='0';
ax.push_back(n-1);
ay.push_back(j+1);
}
if(cnt==2)
{
if(a[n-1][j]=='0') a[n-1][j]='1';
else a[n-1][j]='0';
ax.push_back(n-1);
ay.push_back(j);
}
}
}
for(int i=1;i<=n-1;i+=2)
{
for(int j=1;j<=m-1;j+=2)
{
int sum=check(i,j);
if(sum==4) continue;
else if(sum==3)
check3(i,j);
else if(sum==2)
check2(i,j);
else if(sum==1)
check1(i,j);
else if(sum==0)
check0(i,j);
}
}
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=m-1;j++)
{
int sum=check(i,j);
if(sum==4) continue;
else if(sum==3)
check3(i,j);
else if(sum==2)
check2(i,j);
else if(sum==1)
check1(i,j);
else if(sum==0)
check0(i,j);
}
}
int len=ax.size();
cout<<len/3<<endl;
for(int i=0;i<len;i+=3)
{
cout<<ax[i]<<' '<<ay[i]<<' '<<ax[i+1]<<' '<<ay[i+1]<<' '<<ax[i+2]<<' '<<ay[i+2]<<' '<<endl;
}
}
return 0;
}