質問E:マトリックス変換---------------------------------------------思考(定型質問)

タイトル説明
Dongdongは、サイズがn行、m列の2つの行列AとBを取得します。それぞれの行列には0と1しか含まれていません。Dongdongは、マトリックスAに対して次の操作を何度でも実行できます。
少なくとも2つの行と2つの列を持つマトリックスAの任意のサブマトリックスを取り、4つのコーナーで値を反転します(つまり、0が1になり、1が0になります)。 )。
東洞は、AをBに変換できるかどうかを知りたいと考えています。
入力
テストには複数のデータセットが含まれます。最初の行に、テストデータのセット数を示す正の整数t(3≤t≤10)を入力します。
テストデータの各セットの入力は次のとおりです。
最初の行には、行列の行と列の数を表す2つの正の整数n、m(2≤n、m≤500)が入ります。
次に、2 * n行を入力します。各行にmの0または1を入れ、間にスペースを入れません。
出力
テストデータの各セットについて、AをBに転送できる場合は出力をはい、そうでない場合は出力を出力します。
サンプル入力コピー
。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
出力例コピー
はい
いいえ
はい

分析:
日常的な問題分析のパリティ。
行を変更するたびに、2つの数値が変更され、列も2つの数値が変更されます。
すべての変更された位置a [i] [j] ^ b [i] [j] = 1を前処理して、
各行と列の1の数が奇数かどうか判断します。奇数の場合はNOを
出力しそれ以外の場合は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;
	}
}
公開された元の記事572件 賞賛された14件 ビュー10,000件以上

おすすめ

転載: blog.csdn.net/qq_43690454/article/details/105197755