func(){
for(i는 0~N){
for(j는 0~M){
if(A행렬의 (i,j)값과 B행렬의 (i,j)값이 다르면){
if((i,j)를 좌상단으로 3x3이 존재하지 않으면) return -1; // flip 메서드 사용
뒤집은 횟수 한번 추가 // flip이 유효성 검사를 하면서 실제로 뒤집는 작업도 함
}
if(A의 모든 값과 B의 모든 값이 동일하다면) return 뒤집은 횟수 // CheckAllTrue 메서드 활용
}
}
}
flip(int r, int c){
아래의 값이 배열이 범위를 벗어나면 return false
(r,c),(r,c+1),(r+c,2)
(r+1,c),(r+1,c+1),(r+1,c+2)
(r+2,c),(r+2,c+1),(r+2,c+2)의 값을 모두 반대로 뒤집고 return true
}
CheckAllTrue(){
배열의 모든 값을 순회하면서 false가 발견되면 return false;
false가 하나도 없다면 return true;
}
import java.io.*;
import java.util.*;
public class Main {
static int N,M;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
int[][] NormalBoard = new int[N][M];
for (int i = 0; i < N; i++) {
String s = br.readLine();
for (int j = 0; j < M; j++) {
NormalBoard[i][j] = Integer.parseInt(Character.toString(s.charAt(j)));
}
}
int[][] TargetBoard = new int[N][M];
for (int i = 0; i < N; i++) {
String s = br.readLine();
for (int j = 0; j < M; j++) {
TargetBoard[i][j] = Integer.parseInt(Character.toString(s.charAt(j)));
}
}
// A의 (i,j)값과 B의 (i,j)값이 같다면 true, 다르다면 false
boolean[][] AnswerBoard = new boolean[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(NormalBoard[i][j] == TargetBoard[i][j]) {
AnswerBoard[i][j] = true;
}else {
AnswerBoard[i][j] = false;
}
}
}
System.out.println(func(AnswerBoard));
}
public static boolean flip(int r , int c,boolean[][] board) {
if(r+2<N && c+2 < M) {
for (int i = r; i <= r+2; i++) {
for (int j = c; j <= c+2; j++) {
board[i][j] = !board[i][j];
}
}
return true;
}
return false;
}
public static boolean CheckAllTrue(boolean[][] AnswerBoard) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(!AnswerBoard[i][j]) return false;
}
}
return true;
}
public static int func(boolean[][] AnswerBoard) {
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(!AnswerBoard[i][j]) {
if(!flip(i,j,AnswerBoard)) return -1;
cnt++;
}
if(CheckAllTrue(AnswerBoard)) return cnt;
}
}
return cnt;
}
}