https://codeforces.com/contest/1439/problem/A2
上来两构造题,直接痛苦面具,还好过的不是很慢。。。
从上往下搞,从左向右搞,只要当前为1,不管右边和下面是什么,直接把他变成0
然后考虑最下面两行,从左到右枚举列,不管右边是什么,当前是1,就选当前和右边两个
然后对于右下角的2*2格子,有4个,就先选3个,再搞剩下一个,由A1知道,对于任意一个1,我们可以用3次操作,实现不改变其他格子,把他变0了,
有3个,就直接选了,有2个,就选2个再选1个0,再把多出来的这个1搞了
1个就直接搞
这样对于前面部分,每个格子只会被枚举到一次,对于右下角2*2的方块,我们可以用4次以内的操作全变0
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=110;
int n,m,cnt,cas,tot,ans;
int a[maxl][maxl];
bool vis[maxl];
char s[maxl];
struct node
{
int x,y;
};
vector<node> b;
inline void prework()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=m;j++)
a[i][j]=s[j]-'0';
}
}
inline void gao(int i,int j)
{
if(i+1<=n && j+1<=m)
{
b.push_back(node{i,j});
b.push_back(node{i+1,j});
b.push_back(node{i,j+1});
b.push_back(node{i,j});
b.push_back(node{i+1,j});
b.push_back(node{i+1,j+1});
b.push_back(node{i,j});
b.push_back(node{i,j+1});
b.push_back(node{i+1,j+1});
}
else if(i==n)
{
if(j==m)
{
b.push_back(node{i,j});
b.push_back(node{i-1,j});
b.push_back(node{i,j-1});
b.push_back(node{i,j});
b.push_back(node{i-1,j});
b.push_back(node{i-1,j-1});
b.push_back(node{i,j});
b.push_back(node{i,j-1});
b.push_back(node{i-1,j-1});
}
else
{
b.push_back(node{i,j});
b.push_back(node{i,j+1});
b.push_back(node{i-1,j});
b.push_back(node{i,j});
b.push_back(node{i,j+1});
b.push_back(node{i-1,j+1});
b.push_back(node{i,j});
b.push_back(node{i-1,j});
b.push_back(node{i-1,j+1});
}
}
else
{
b.push_back(node{i,j});
b.push_back(node{i,j-1});
b.push_back(node{i+1,j});
b.push_back(node{i,j});
b.push_back(node{i,j-1});
b.push_back(node{i+1,j-1});
b.push_back(node{i,j});
b.push_back(node{i+1,j});
b.push_back(node{i+1,j-1});
}
}
inline void mainwork()
{
b.clear();
for(int i=1;i<=n-2;i++)
for(int j=1;j<=m;j++)
if(a[i][j])
{
if(j<m)
{
b.push_back(node{i,j});a[i][j]^=1;
b.push_back(node{i,j+1});a[i][j+1]^=1;
b.push_back(node{i+1,j});a[i+1][j]^=1;
}
else
{
b.push_back(node{i,j});a[i][j]^=1;
b.push_back(node{i+1,j});a[i+1][j]^=1;
b.push_back(node{i+1,j-1});a[i+1][j-1]^=1;
}
}
for(int j=1;j<=m-2;j++)
{
if(a[n-1][j])
{
int i=n-1;
b.push_back(node{i,j});a[i][j]^=1;
b.push_back(node{i,j+1});a[i][j+1]^=1;
b.push_back(node{i+1,j+1});a[i+1][j+1]^=1;
}
if(a[n][j])
{
int i=n;
b.push_back(node{i,j});a[i][j]^=1;
b.push_back(node{i,j+1});a[i][j+1]^=1;
b.push_back(node{i-1,j+1});a[i-1][j+1]^=1;
}
}
cnt=0;
for(int i=n-1;i<=n;i++)
for(int j=m-1;j<=m;j++)
if(a[i][j])
++cnt;
if(cnt>=3)
{
int now=0;
for(int i=n-1;i<=n;i++)
for(int j=m-1;j<=m;j++)
if(a[i][j])
{
b.push_back(node{i,j});a[i][j]=0;
++now;if(now==3) break;
}
for(int i=n-1;i<=n;i++)
for(int j=m-1;j<=m;j++)
if(a[i][j])
gao(i,j),a[i][j]=0;
}
else if(cnt==2)
{
for(int i=n-1;i<=n;i++)
for(int j=m-1;j<=m;j++)
if(a[i][j])
b.push_back(node{i,j});
int x,y;
for(int i=n-1;i<=n;i++)
for(int j=m-1;j<=m;j++)
if(!a[i][j])
{
b.push_back(node{i,j});
gao(i,j);
a[n-1][m-1]=a[n-1][m]=a[n][m-1]=a[n][m]=0;
return;
}
}
else if(cnt==1)
{
for(int i=n-1;i<=n;i++)
for(int j=m-1;j<=m;j++)
if(a[i][j])
gao(i,j),a[i][j]=0;
}
}
inline void print()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j])
puts("wa");
int k=b.size();
printf("%d\n",k/3);
for(int i=0;i<k/3;i++)
printf("%d %d %d %d %d %d\n",b[i*3].x,b[i*3].y,b[i*3+1].x,b[i*3+1].y,b[i*3+2].x,b[i*3+2].y);
}
int main()
{
int t=1;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}