백준 1080번 행렬 문제풀이(C++)

YooHeeJoon·2022년 11월 4일
0

백준 문제풀이

목록 보기
37/56

백준 1080번 행렬

아이디어

문제)
두 행렬 A와 B를 가지고 A -> B로 만들 수 있는 최소 횟수
단, A행렬을 변환할 때에는 3 * 3 역의 값을 반전 시킨다


즉, (0,0)부터 (n,m)까지의 원소들을 비교하고 다를 때 마다 해당 좌표 기준으로 (y+3,x+3)을 전부 반전 시켜주고, 반전시킬 때마다 count를 통하여 바꾼 횟수를 알아낸다

마지막으로 A와 B를 비교 해서 같은지를 판별한다

문제풀이

#include<bits/stdc++.h>
using namespace std;
char A[55][55];
char B[55][55];
int n, m;
int cnt;
void init(char tmp[55][55]) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> tmp[i][j];
		}
	}
}
void change(int y, int x) {
	for (int i = y; i < y + 3; i++) {
		for (int j = x; j < x + 3; j++) {
			A[i][j] = A[i][j] == '0' ? '1' : '0';
		}
	}
}
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin >> n >> m;
	init(A); init(B);
	for (int i = 0; i < n - 2; i++) {
		for (int j = 0; j < m - 2; j++) {
			if (A[i][j] != B[i][j]) {
				change(i, j);
				cnt++;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (A[i][j] != B[i][j]) {
				cout << -1 << '\n';
				return 0;
			}
		}
	}
	cout << cnt << '\n';
	return 0;
}

0개의 댓글