Двоичная таблица (сложная версия) - (мышление)

Описание заголовка: нажмите, чтобы войти

заглавие

Дайте вам двоичную таблицу размера n × м. Эта таблица состоит из символа 0 и символа 1.
Вы можете сделать это:
выберите 3 разные ячейки, которые принадлежат квадрату 2 × 2, и измените символы в этих ячейках (измените 0 на 1 и 1 на 0).
Ваша задача сделать так, чтобы все символы в таблице были равны 0. Вы можете выполнять до нм операций.
Не нужно минимизировать количество операций.

Идеи

Это расширенная версия предыдущего вопроса . Количество операций изменено на nm. Код, который у меня был в прошлый раз, был проблемным, и у меня не было другого выбора, кроме как оптимизировать его, но это была всего лишь небольшая оптимизация для граничной обработки, но это было волшебно (волшебная магия, по словам брата xy Другими словами, его можно очистить.)
Оптимизация: при оценке границы весь прямоугольник 2 * 2, который содержит границу, заменяется только линией границы, что может уменьшить количество операций.

Код

#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;
}

рекомендация

отblog.csdn.net/Cosmic_Tree/article/details/109772397