0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.
행렬을 변환하는 연산은 어떤 3×3크기의 부분 행렬에 있는 모든 원소를 뒤집는 것이다. (0 → 1, 1 → 0)
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
첫째 줄에 문제의 정답을 출력한다. 만약 A를 B로 바꿀 수 없다면 -1을 출력한다.
if(N>=3 && M>=3) {
for (int t = 0; t < N-2; t++) {
for (int k = 0; k < M-2; k++) {
if (matrix1[t][k] != matrix2[t][k]) {
for (int i = t; i < t + 3; i++) {
for (int j = k; j < k + 3; j++) {
if(matrix1[i][j]) matrix1[i][j] = false;
else matrix1[i][j] = true;
}
}
answer +=1;
}
}
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class boj1080 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int answer = 0;
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
boolean[][] matrix2 = new boolean[N][M];
boolean[][] matrix1 = new boolean[N][M];
for (int i = 0; i < N; i++) {
String[] temp = br.readLine().split("");
for (int j = 0; j < M; j++) {
if (temp[j].equals("1")) matrix1[i][j] = true;
}
}
for (int i = 0; i < N; i++) {
String[] temp = br.readLine().split("");
for (int j = 0; j < M; j++) {
if (temp[j].equals("1")) matrix2[i][j] = true;
}
}
if(N>=3 && M>=3) {
for (int t = 0; t < N-2; t++) {
for (int k = 0; k < M-2; k++) {
if (matrix1[t][k] != matrix2[t][k]) {
for (int i = t; i < t + 3; i++) {
for (int j = k; j < k + 3; j++) {
if(matrix1[i][j]) matrix1[i][j] = false;
else matrix1[i][j] = true;
}
}
answer +=1;
}
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(matrix1[i][j] != matrix2[i][j]){
answer = -1;
}
}
}
System.out.println(answer);
}
}