Pergunta E: Conversão de matrizes --------------------------------------------- Pensamento (perguntas de rotina)

Título Descrição
Dongdong obtém duas matrizes A e B de tamanho n linhas e m colunas, cada uma das quais contém apenas 0 e 1. Dongdong pode executar as seguintes operações na matriz A várias vezes:
pegue qualquer submatriz da matriz A com pelo menos duas linhas e duas colunas e inverta os valores em seus quatro cantos (ou seja, 0 se torna 1 e 1 se torna 0 )
Dongdong quer saber se A pode ser convertido em B.
Entrada O
teste contém vários conjuntos de dados.Na primeira linha, insira um número inteiro positivo t (3≤t≤10) para indicar o número de conjuntos de dados de teste.
A entrada de cada conjunto de dados de teste é a seguinte: a
primeira linha insere dois números inteiros positivos n, m (2≤n, m≤500), que representa o número de linhas e colunas da matriz.
Em seguida, insira 2 * n linhas com m 0s ou 1s em cada linha, sem espaços entre eles.
Saída
Para cada conjunto de dados de teste, se A puder ser transferido para B, então sim, caso contrário, não.
Entrada de amostra Cópia
3
3 3
010
010
100
100
100
100
3 4
0101
1010
0101
1111
1111
1111
6 7
0011001
0100101
0001001
1010100
0100101
0101001
1101011
0110100
1101001
1010010
0110100
0111101
Saída de amostra Cópia
Sim
Não
Sim

Análise:
Paridade de análise de rotina de problemas.
Cada vez que você modifica uma linha, dois números são alterados e uma coluna também altera dois números.
Pré-processe todas as posições modificadas a [i] [j] ^ b [i] [j] = 1 para
determinar se o número de 1 em cada linha e coluna é um número ímpar, digite NO para números ímpares,
caso contrário , digite YES

#include<bits/stdc++.h>
using namespace std;
const int N=1000;
int t,n,m;
char a[N][N];
char b[N][N];
int g[N][N];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&n,&m);
		for(int i=1;i<=n;i++) cin>>(a[i]+1);
		for(int i=1;i<=n;i++) cin>>(b[i]+1);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				g[i][j]=(a[i][j]-'0')^(b[i][j]-'0');
			}
		}
		int f=0;
		for(int i=1;i<=n;i++)
		{
			int num=0;
			for(int j=1;j<=m;j++)
			{
				if(g[i][j]==1) num++;
			 } 
			 if(num&1) f=1;
		}
		for(int i=1;i<=m;i++)
		{
			int num=0;
			for(int j=1;j<=n;j++)
			{
				if(g[j][i]==1) num++;
			 } 
			 if(num&1) f=1;
		}
		if(f==1) cout<<"No"<<endl;
		else cout<<"Yes"<<endl;
	}
}
Publicado 572 artigos originais · elogiados 14 · 10.000+ visualizações

Acho que você gosta

Origin blog.csdn.net/qq_43690454/article/details/105197755
Recomendado
Clasificación