Programming/BOJ

[백준/BOJ] 1080 행렬

he1fire 2020. 11. 29. 01:17
728x90

문제 : 1080 행렬

 

1080번: 행렬

첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.

www.acmicpc.net

행렬 A와 행렬 B가 주어질 때 3*3 크기의 모든 원소를 뒤집어서

행렬 A를 행렬 B로 만드는 최소 횟수를 구하는 문제이다.

그리디 하게 앞 원소부터 모두 뒤집어 본 후 불가능한 경우를 체크해주면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll N, M, ans;
string x[55], y[55];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> M;
    for (int i=0;i<N;i++)
        cin >> x[i];
    for (int i=0;i<N;i++)
        cin >> y[i];
    for (int i=0;i<N-2;i++){
        for (int j=0;j<M-2;j++){
            if (x[i][j]!=y[i][j]){
                ans++;
                for (int a=i;a<i+3;a++){
                    for (int b=j;b<j+3;b++){
                        x[a][b]=='0' ? x[a][b]='1' : x[a][b]='0';
                    }
                }
            }
        }
    }
    for (int i=0;i<N;i++){
        for (int j=0;j<M;j++){
            if (x[i][j]!=y[i][j]){
                cout << "-1";
                return 0;
            }
        }
    }
    cout << ans;
    return 0;
}
728x90