首页 > 其他分享 >【题解】CF1439A2

【题解】CF1439A2

时间:2023-03-20 15:56:21浏览次数:33  
标签:cnt int 题解 back mov act push CF1439A2

题目描述

给定一个 \(n\times m\) 的 \(01\) 矩阵,每次操作可以将某个 \(2\times2\) 的矩阵内的 \(3\) 个数取反,请在 \(n\times m\) 步内将矩阵变为全 \(0\)。

题解

这种题就是要手推数据啊!还有就是从小的情况入手,看能否拆分子问题。
对于一个\(2\times2\)的矩阵,我们发现可以用最多四次将它还原。
对于周边余下的\(1\times n\)和\(1\times m\)的数,先随便怎么还原一下。

#include<bits/stdc++.h>
using namespace std;
inline int rd(){
	int f=1,j=0;
	char w=getchar();
	while(!isdigit(w)){
		if(w=='-')f=-1;
		w=getchar();
	}
	while(isdigit(w)){
		j=j*10+w-'0';
		w=getchar();
	}
	return f*j;
}
const int N=200;
struct act{
	int x,y;
};
vector<act>mov[16];
int n,m;
void init(){
	mov[1].push_back((act){2,2});mov[1].push_back((act){2,1});mov[1].push_back((act){1,2});
	mov[2].push_back((act){2,1});mov[2].push_back((act){1,1});mov[2].push_back((act){2,2});
	mov[3].push_back((act){1,2});mov[3].push_back((act){1,1});
	mov[4].push_back((act){1,2});mov[4].push_back((act){1,1});mov[4].push_back((act){2,2});
	mov[5].push_back((act){2,1});mov[5].push_back((act){1,1});
	mov[6].push_back((act){2,1});mov[6].push_back((act){1,2});
	mov[7].push_back((act){2,2});
	mov[8].push_back((act){1,1});mov[8].push_back((act){2,1});mov[8].push_back((act){1,2});
	mov[9].push_back((act){1,1});mov[9].push_back((act){2,2});
	mov[10].push_back((act){1,2});mov[10].push_back((act){2,2});
	mov[11].push_back((act){2,1});
	mov[12].push_back((act){2,1});mov[12].push_back((act){2,2});
	mov[13].push_back((act){1,2});
	mov[14].push_back((act){1,1});
	mov[15].push_back((act){1,1});mov[15].push_back((act){2,2});mov[15].push_back((act){2,1});mov[15].push_back((act){1,2});
	return ;	
}
int X[5]={0,0,0,1,-1};
int Y[5]={0,1,-1,0,0};
char s[N];
bool sum[N][N];
struct Ans{
	int x[3],y[3];
}ans[N*N];
int cnt;
void deal(int a,int b,int x,int y){
	a--,b--;
	int tot=0;
	cnt++;
	for(int i=0;i<5;i++){
		int xx=X[i]+x,yy=Y[i]+y;
		if(xx<1||xx>2||yy<1||yy>2)continue;
		ans[cnt].x[tot]=a+xx,ans[cnt].y[tot]=b+yy;
		sum[a+xx][b+yy]^=1;
		tot++;
	}
	return ;
}
void work(){
	n=rd(),m=rd();
	cnt=0;
	for(int i=1;i<=n;i++){
		scanf("%s",s+1);
		for(int j=1;j<=m;j++)sum[i][j]=s[j]-'0';
	}
	if(n&1){
		for(int i=1;i<m;i++)if(sum[n][i])deal(n-1,i,1,1);
		if(sum[n][m])deal(n-1,m-1,1,2);
		n--;
	}
	if(m&1){
		for(int i=1;i<n;i++)if(sum[i][m])deal(i,m-1,1,1);
		if(sum[n][m])deal(n-1,m-1,2,1);
		m--;
	}
//	for(int i=1;i<=n+1;i++){
//		for(int j=1;j<=m+1;j++)cout<<sum[i][j]<<" ";
//		cout<<"\n"; 
//	}
	for(int i=1;i<=n;i+=2){
		for(int j=1;j<=m;j+=2){
			int sumn=0;
			sumn=sumn*2+sum[i][j];
			sumn=sumn*2+sum[i][j+1];
			sumn=sumn*2+sum[i+1][j];
			sumn=sumn*2+sum[i+1][j+1];
//			cout<<i<<"-"<<j<<":"<<sumn<<"\n"; 
			for(auto a:mov[sumn])deal(i,j,a.x,a.y);
		}
	}
	printf("%d\n",cnt);
	for(int i=1;i<=cnt;i++){
		for(int j=0;j<3;j++)printf("%d %d ",ans[i].x[j],ans[i].y[j]);
		printf("\n");
	}
	return ;
}
signed main(){
	init();
	int T=rd();
	while(T--)work();
	return 0;
}
/*
1
2 2
00
11
*/

标签:cnt,int,题解,back,mov,act,push,CF1439A2
From: https://www.cnblogs.com/T-water/p/17236591.html

相关文章

  • C# 上传接口返回错误: (413) Request Entity Too Large问题解决
    问题报错:Failedtoloadresource:theserverrespondedwithastatusof413(RequestEntityTooLarge)找了很多方法,说什么反向代理配置啥的其实很多项目并没有开反......
  • CF1804C 题解
    题目链接今天好不容易有空更那就再更一篇(一道很有意思的诈骗题,我会写出我的思考过程。题意:(我的翻译)一个转盘有$n$个格子分别为$0$$1$$2$$\cdots$$n-1$,初始时在......
  • 【题解】ABC294
    AtCoderBeginnerContest294AFilter无意义题,找出所有偶数。BASCIIArt无意义题,按题意模拟。CMergeSequences无意义题,离散化即可。DBank无意义题,set维护即......
  • ucyhf 题解
    题目传送门愚人节题目,具体题面看翻译。先写一个判断素数的函数,这题并不需要什么特殊的筛法,新手可以参考以下代码。boolisprime(intx){if(x<=1)return0;......
  • Party 题解
    题目传送门一道简单的并查集练手题。与普通的并查集不同,除此之外还需记录下来某两人的讨厌关系,使得他们不能在同一集合中。if(find_root(x)==find_root(y))vis[find......
  • CF1060E 题解
    前言题目传送门!更好的阅读体验?提供一种更加麻烦的换根DP写法。思路代码#include<iostream>#include<cstdio>usingnamespacestd;typedeflonglongll;cons......
  • 3 月 15 日测试题解
    3月15日测试题解这学校的评测机我是真的吐了,\(\text{380pts}\rightarrow\text{300pts}\),电脑速度跟BZOJ有的一拼。一句话总结:简单,过于简单,但是在练习读题能力上十......
  • 3 月 19 日测试题解
    3月19日测试题解原来这就是AK的滋味吗,不过,我却完全没感到开心呢。T1题意给出两个整数\(a\),\(b\),重复以下操作直到\(a=b\):设\(a>b\),否则交换\(a\)与\(......
  • P5445 [APIO2019] 路灯 题解
    题目链接题目描述给你一个01串,有\(q\)个时刻,每个时刻要么把一位取反,要么问你在过去的所有时刻中有多少个时刻\(a\)和\(b-1\)之间都为1。题目分析观察题目,我们......
  • 2023.3.19 模拟赛题解
    银行取款题意在现代文明社会中,大家在诸如银行办理业务、车站买票等活动时都很文明,没有插队的现象,本着"先来先服务"的规矩。初赛已经结束了,凡凡的爸爸打算上银行去取点......