4주차-5)
행렬
0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.
연산을 위한 flip 함수 정의.
배열에 저장된 값이 0이라면 1로 1이라면 0으로 바꿔주는 함수.
a배열과 b배열을 입력 가능한 최대인 50×50배열로 선언해 주었고 둘의 i행 j열의 값이 같으면 0 다르면 1을 저장해주는 행렬 result도 선언해줌.
공백없이 숫자가 입력되기 때문에 스트링 num을 이용해 행을 받고 이를 for문을 이용해 a배열과 b배열에 값을 삽입해 줌.
for 문 이중 루프를 이용함여 a와 b에 저장된 모든 원소를 비교해 result에 삽입해줌
다음 이중 루프에서는 result의 값을 확인해 1행 1열, 1행 2열,,,,1행 n열 ,,,n행 m열까지 비교하며 1이 저장되어 있을 경우 filp함수를 시행하고 count값을 증가시킴.
더이상 filp이 불가능한 경우 -1을 프린트하고 종료.
정상 완료 되었을 경우에는 count값을 프린트 하고 종료.
#include <iostream>
#include <string>
using namespace std;
void flip(char result[50][50], int x, int y) {
for (int i = x; i < x + 3; ++i) {
for (int j = y; j < y + 3; ++j) {
result[i][j] = (result[i][j] == '0') ? '1' : '0';
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int count = 0;
char a[50][50];
char b[50][50];
char result[50][50];
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
string num;
cin >> num;
for (int j = 0; j < m; j++) {
a[i][j] = num[j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> b[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] == b[i][j]) {
result[i][j] = '0';
}
else {
result[i][j] = '1';
}
}
}
for (int i = 0; i < n - 2; i++) {
for (int j = 0; j < m - 2; j++) {
if (result[i][j] == '1') {
flip(result, i, j);
count++;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (result[i][j] == '1') {
cout << -1;
return 0;
}
}
}
cout << count;
return 0;
}