Binary Table (Hard Version)-(思维)

博客围绕一个大小为n×m的二进制表操作问题展开。问题是通过特定操作使表中所有符号为0,最多进行nm次操作。作者表示这是上一题加强版,原代码不通过,对边界处理优化后神奇通过,优化方式是边界特判时只看边界线,减少操作次数。
题目描述:点击进入
题意

给你一个大小为n×m的二进制表,这个表由符号 0 和符号 1 组成。
你可以进行这样的操作:
选择属于一个 2 × 2 正方形的 3 个不同的单元格,并更改这些单元格中的符号(将 0 更改为1, 1 更改为 0 )。
你的任务是使表中的所有符号都等于0。您最多可以进行 nm次 操作。
你不需要最小化操作的数量。

思路

这是上一题的加强版,操作次数变为 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;
}

CREATE STABLE IF NOT EXISTS my_battery_info ( -> ts TIMESTAMP, -> battery_voltage INT, -> battery_current INT, -> battery_soc INT, -> battery_hard_version BINARY(100), -> battery_soft_version BINARY(100), -> battery_work_mode BINARY(100), -> battery_protect_code BINARY(100), -> battery_error_code BINARY(100), -> battery_temperature_max INT, -> battery_temperature_min INT, -> battery_voltage_max INT, -> battery_voltage_min INT, -> mos_status INT, -> mos_temp INT, -> battery_cycle_times INT, -> steady_status INT, -> cell_voltage BINARY(500), -> model BINARY(100), -> manufacture BINARY(100), -> imei BINARY(100), -> imsi BINARY(100), -> iccid BINARY(100), -> tracker_hardware_version BINARY(100), -> tracker_software_version BINARY(100), -> csq BINARY(100), -> network_type BINARY(100), -> location_mode BINARY(100), -> longitude BINARY(100), -> longitude_direction BINARY(100), -> latitude BINARY(100), -> latitude_direction BINARY(100), -> gps_speed BINARY(100), -> gps_signal BINARY(100), -> satellite_num BINARY(100), -> accuracy BINARY(100), -> flag INT, -> client_id BINARY(100), -> topic BINARY(100), -> product_key BINARY(100), -> handled INT, -> todo_now INT, -> needack TINYINT, -> businessmode BINARY(100), -> create_time TIMESTAMP, -> update_time TIMESTAMP, -> payload BINARY(5000), -> project_id INT, -> sn BINARY(100), -> soh INT, -> battery_temperature_avg INT, -> charge_mode INT, -> low_battery_warn INT, -> charge_current_max INT, -> discharge_current_max INT, -> charge_current_avg INT, -> discharge_current_avg INT, -> gps_cog BINARY(100), -> total_charge_energy DOUBLE, -> charge_cycles_history INT, -> charge_capacity_history DOUBLE, -> discharge_capacity_history DOUBLE, -> ntc1 INT, -> ntc2 INT, -> ntc3 INT, -> ntc4 INT, -> tracker_communication_status BINARY(100), -> battery_kind BINARY(100), -> dsoc INT, -> correction_rate INT, -> tsoc INT, -> bsoc INT, -> fcc INT, -> actual_soh INT, -> charging_sop INT, -> discharging_sop INT, -> task_max_delay_1ms INT, -> task_max_delay_10ms INT, -> task_max_delay_100ms INT, -> task_max_delay_500ms INT, -> task_max_time_1ms INT, -> task_max_time_10ms INT, -> task_max_time_100ms INT, -> task_max_time_500ms INT, -> empty_count INT, -> cell_info BINARY(5000), -> gps_max_signal INT, -> msg_delay_time INT, -> data_type INT, -> battery_vehicle_status INT, -> storage_status INT, -> ota_status INT, -> lock_status INT, -> battery_vehicle_alarm_status INT -> ) TAGS ( -> battery_id BINARY(100) -> ); DB error: syntax error near "topic binary(100), product_key binary(10 (0.002842s)
最新发布
11-12
CREATE STABLE IF NOT EXISTS my_battery_info ( -> `ts` TIMESTAMP, -> `battery_voltage` INT, -> `battery_current` INT, -> `battery_soc` INT, -> `battery_hard_version` BINARY(100), -> `battery_soft_version` BINARY(100), -> `battery_work_mode` BINARY(100), -> `battery_protect_code` BINARY(100), -> `battery_error_code` BINARY(100), -> `battery_temperature_max` INT, -> `battery_temperature_min` INT, -> `battery_voltage_max` INT, -> `battery_voltage_min` INT, -> `mos_status` INT, -> `mos_temp` INT, -> `battery_cycle_times` INT, -> `steady_status` INT, -> `cell_voltage` BINARY(500), -> `model` BINARY(100), -> `manufacture` BINARY(100), -> `imei` BINARY(100), -> `imsi` BINARY(100), -> `iccid` BINARY(100), -> `tracker_hardware_version` BINARY(100), -> `tracker_software_version` BINARY(100), -> `csq` BINARY(100), -> `network_type` BINARY(100), -> `location_mode` BINARY(100), -> `longitude` BINARY(100), -> `longitude_direction` BINARY(100), -> `latitude` BINARY(100), -> `latitude_direction` BINARY(100), -> `gps_speed` BINARY(100), -> `gps_signal` BINARY(100), -> `satellite_num` BINARY(100), -> `accuracy` BINARY(100), -> `flag` INT, -> `client_id` BINARY(100), -> `topic` BINARY(100), -> `product_key` BINARY(100), -> `handled` INT, -> `todo_now` INT, -> `needack` TINYINT, -> `businessmode` BINARY(100), -> `create_time` TIMESTAMP, -> `update_time` TIMESTAMP, -> `payload` BINARY(5000), -> `project_id` INT, -> `sn` BINARY(100), -> `soh` INT, -> `battery_temperature_avg` INT, -> `charge_mode` INT, -> `low_battery_warn` INT, -> `charge_current_max` INT, -> `discharge_current_max` INT, -> `charge_current_avg` INT, -> `discharge_current_avg` INT, -> `gps_cog` BINARY(100), -> `total_charge_energy` DOUBLE, -> `charge_cycles_history` INT, -> `charge_capacity_history` DOUBLE, -> `discharge_capacity_history` DOUBLE, -> `ntc1` INT, -> `ntc2` INT, -> `ntc3` INT, -> `ntc4` INT, -> `tracker_communication_status` BINARY(100), -> `battery_kind` BINARY(100), -> `dsoc` INT, -> `correction_rate` INT, -> `tsoc` INT, -> `bsoc` INT, -> `fcc` INT, -> `actual_soh` INT, -> `charging_sop` INT, -> `discharging_sop` INT, -> `task_max_delay_1ms` INT, -> `task_max_delay_10ms` INT, -> `task_max_delay_100ms` INT, -> `task_max_delay_500ms` INT, -> `task_max_time_1ms` INT, -> `task_max_time_10ms` INT, -> `task_max_time_100ms` INT, -> `task_max_time_500ms` INT, -> `empty_count` INT, -> `cell_info` BINARY(5000), -> `gps_max_signal` INT, -> `msg_delay_time` INT, -> `data_type` INT, -> `battery_vehicle_status` INT, -> `storage_status` INT, -> `ota_status` INT, -> `lock_status` INT, -> `battery_vehicle_alarm_status` INT -> ) TAGS ( -> `battery_id` BINARY(100) -> ); DB error: syntax error near 'unrecognized token: "`ts` timestamp, `battery_voltage` int,' (0.000448s)
11-12
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值