Binary Table (Hard Version)(Easy Version)

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; 
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值