https://codeforces.com/contest/1440/problem/C2
题意:
给出n,m,给出nm的矩阵,由0和1组成,每次你可以执行一个操作,选出22正方形中的三个数,将这三个数反转。问在有限的步骤之内将矩阵变为全为0的矩阵的操作数以及操作。简单和困难问题的差别就是,操作数上限的不同。
思路:
构造。从左上到右下开始遍历,遇到1就将它变为0,再将右侧的数和下面的数转变。因为右侧和下面相邻的数都将再之后的遍历中操作到,如果是1的话会将其变为零,所以无论怎样转换都没有影响。
执行此操作一直到倒数第三行。从倒数第二行开始,按照列进行扫描。如果是1的话,就将右侧一列的两个数转换。同理,这两个数在之后的操作中都会遍历到,无论怎样转换对结果的正确性没有影响。
执行此操作直到最后的22矩阵。最后的这个22矩阵最多可以用四步转换为全0矩阵,而在之前我们是逐个遍历的,所以之前执行的操作数最多是nm-4,综上所述操作数最多为nm,满足题意,可以按此方法进行构造。
代码;
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
const double N = 1e6+10;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const inline int read(){
int k = 0, f = 1; char c = getchar();
for(;!isdigit(c); c = getchar())
if(c == '-') f = -1;
for(;isdigit(c); c = getchar())
k = k * 10 + c - '0';
return k * f;
}
#define ll long long
#define CL(a,b) memset(a,b,sizeof(a))
#define MAXN 205010
int a[110][110];
int x[MAXN];
int y[MAXN];
char c[110][110];
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while(t--)
{
ll n , m;
cin >> n >> m;
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= m ; j++)
{
cin >> c[i][j];
if(c[i][j] == '1')
a[i][j] = 1;
else
a[i][j] = 0;
}
}
int num = 0;
int l = 0;
for(int i = 1 ; i <= n-2 ; i++)
{
for(int j = 1 ; j <= m ; j++)
{
if(a[i][j] == 1)
{
num++;
a[i][j] = 0;
if(j!=m)
{
if(a[i][j+1]==1)
a[i][j+1] = 0;
else
a[i][j+1] = 1;
if(a[i+1][j]==1)
a[i+1][j] = 0;
else
a[i+1][j] = 1;
x[l] = i;
y[l] = j;
l++;
x[l] = i;
y[l] = j+1;
l++;
x[l] = i+1;
y[l] = j;
l++;
}
else
{
if(a[i+1][j]==1)
a[i+1][j] = 0;
else
a[i+1][j] = 1;
if(a[i+1][j-1]==1)
a[i+1][j-1] = 0;
else
a[i+1][j-1] = 1;
x[l] = i;
y[l] = j;
l++;
x[l] = i+1;
y[l] = j;
l++;
x[l] = i+1;
y[l] = j-1;
l++;
}
}
}
}
for(int i = 1 ; i <= m-2 ; i++)
{
for(int j = n-1 ; j <= n ; j++)
{
if(a[j][i] == 1)
{
num++;
a[j][i] = 0;
if(j==n-1)
{
if(a[j][i+1]==1)
a[j][i+1] = 0;
else
a[j][i+1] = 1;
if(a[j+1][i+1]==1)
a[j+1][i+1] = 0;
else
a[j+1][i+1] = 1;
x[l] = j;
y[l] = i;
l++;
x[l] = j;
y[l] = i+1;
l++;
x[l] = j+1;
y[l] = i+1;
l++;
}
else
{
if(a[j][i+1]==1)
a[j][i+1] = 0;
else
a[j][i+1] = 1;
if(a[j-1][i+1]==1)
a[j-1][i+1] = 0;
else
a[j-1][i+1] = 1;
x[l] = j;
y[l] = i;
l++;
x[l] = j;
y[l] = i+1;
l++;
x[l] = j-1;
y[l] = i+1;
l++;
}
}
}
}
// cout << "****" << endl;
// for(int i = 1; i <= n ; i++)
// {
// for(int j = 1 ; j <= m ; j++)
// {
// cout << a[i][j] << " ";
// }
// cout << endl;
// }
// cout << "****" << endl;
if(a[n-1][m-1]==0&&a[n-1][m]==0&&a[n][m-1]==0&&a[n][m]==1)
{
num = num + 3;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==0&&a[n-1][m]==0&&a[n][m-1]==1&&a[n][m]==0)
{
num = num + 3;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==0&&a[n-1][m]==0&&a[n][m-1]==1&&a[n][m]==1)
{
num = num + 2;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==0&&a[n-1][m]==1&&a[n][m-1]==0&&a[n][m]==0)
{
num = num + 3;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==0&&a[n-1][m]==1&&a[n][m-1]==0&&a[n][m]==1)
{
num = num + 2;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==0&&a[n-1][m]==1&&a[n][m-1]==1&&a[n][m]==0)
{
num = num + 2;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==0&&a[n-1][m]==1&&a[n][m-1]==1&&a[n][m]==1)
{
num = num + 1;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
}
else if(a[n-1][m-1]==1&&a[n-1][m]==0&&a[n][m-1]==0&&a[n][m]==0)
{
num = num + 3;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==1&&a[n-1][m]==0&&a[n][m-1]==0&&a[n][m]==1)
{
num = num + 2;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==1&&a[n-1][m]==0&&a[n][m-1]==1&&a[n][m]==0)
{
num = num + 2;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==1&&a[n-1][m]==0&&a[n][m-1]==1&&a[n][m]==1)
{
num = num + 1;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
}
else if(a[n-1][m-1]==1&&a[n-1][m]==1&&a[n][m-1]==0&&a[n][m]==0)
{
num = num + 2;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==1&&a[n-1][m]==1&&a[n][m-1]==0&&a[n][m]==1)
{
num = num + 1;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
}
else if(a[n-1][m-1]==1&&a[n-1][m]==1&&a[n][m-1]==1&&a[n][m]==0)
{
num = num + 1;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
else if(a[n-1][m-1]==1&&a[n-1][m]==1&&a[n][m-1]==1&&a[n][m]==1)
{
num = num + 4;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
x[l] = n;
y[l] = m;
l++;
x[l] = n-1;
y[l] = m-1;
l++;
x[l] = n-1;
y[l] = m;
l++;
x[l] = n;
y[l] = m-1;
l++;
}
cout << num << endl;
for(int i = 0 ; i < l ; i=i+3)
{
cout << x[i] << " " << y[i] << " ";
cout << x[i+1] << " " << y[i+1] << " ";
cout << x[i+2] << " " << y[i+2] << endl;
}
}
return 0;
}