기록공간

행렬 (백준 - 1080번) 본문

Algorithm/문제

행렬 (백준 - 1080번)

입코딩 2020. 2. 19. 20:26
반응형

행렬의 행(N)이나 열(M)의 크기가 하나라도 3보다 작은 경우에는 원소 뒤집기 작업(XOR)이 불가능하기 때문에 A와 B가 서로 같은지만 확인하면 된다.

 

만약 둘 다 3보다 큰 경우 1행부터 N - 3행까지 그리고 1열부터 M - 3열까지 A와 B가 특정위치에서 서로 같은지를 검사하며 다른 경우 그 위치에서부터 XOR를 진행한다. 모두 끝난 후에 행렬 A와 B가 같은지 확인하면 끝이 난다.

 

코드는 다음과 같다.

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

void XOR(char** mat, int N, int M)
{
	for (int i = N; i < N + 3; ++i)
	{
		for (int j = M; j < M + 3; ++j)
		{
			char temp = mat[i][j];
			if ('1' == temp)
				--mat[i][j];
			else
				++mat[i][j];
		}
	}
}

int main()
{
	int n, m;
	cin >> n >> m;

	char** A = new char*[n];
	for (int i = 0; i < n; ++i)
	{
		A[i] = new char[m + 1];
		cin >> A[i];
	}

	char** B = new char*[n];
	for (int i = 0; i < n; ++i)
	{
		B[i] = new char[m + 1];
		cin >> B[i];
	}

	int count = 0;
	bool check = true;
	if (m >= 3 && n >= 3)
	{
		for (int i = 0; i <= n - 3; ++i)
		{
			for (int j = 0; j <= m - 3; ++j)
			{
				if (A[i][j] != B[i][j])
				{
					XOR(A, i, j);
					++count;
				}
			}
		}

		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < m; ++j)
			{
				if (A[i][j] != B[i][j])
					check = false;
			}
		}
	}
	else
	{
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < m; ++j)
			{
				if (A[i][j] != B[i][j])
					check = false;
			}
		}
	}

	if (false == check)
		count = -1;

	cout << count << endl;

	for (int i = 0; i < n; ++i)
	{
		delete[] A[i];
		delete[] B[i];
	}
	delete[] A;
	delete[] B;
}
반응형

'Algorithm > 문제' 카테고리의 다른 글

1로 만들기 (백준 - 1463번)  (0) 2020.02.20
반도체 설계 (백준 - 2352번)  (0) 2020.02.19
부등호 (백준 - 2529번)  (0) 2020.02.19
기타줄 (백준 - 1049번)  (0) 2020.02.13
신입 사원 (백준 - 1946번)  (0) 2020.02.13
Comments