https://www.acmicpc.net/problem/1080

Baekjoon Online JudgeBaekjoon Online Judgewww.acmicpc.net


이 문제인데


전 행렬변환이 3*3만 되니까 세칸씩 비교해도 된다고 생각해가지고   

조건문을 이렇게 걸었거든요


// 행 뒤집기
    for ( int j = 0 ; j < M-2; j++) {
        for ( int i = 0 ; i < N-2; i++) {
            if ( ( A[i][j] != B[i][j] ) && ( A[i][j+1] != B[i][j+1] ) && ( A[i][j+2] != B[i][j+2] ) ) {
                ReverseMatrix(i,j);
                CNT++;
            }
        }
    }

    // 열뒤집기
    for ( int i = 0 ; i < N-2; i++) {
        for ( int j = 0; j < M-2; j++) {
            if ( ( A[i][j] != B[i][j] ) && ( A[i+1][j] != B[i+1][j] ) && ( A[i+2][j] != B[i+2][j] ) ) {
                ReverseMatrix(i,j);
                CNT++;
            }
        }
    }


예제 케이스는 모두 맞았고 ( A랑 B가 다른 3*3 미만 행렬인 경우 예외처리 했음 ) , 질문게시판에 있는 반례도 다 넣어봤는데 다 통과했음

근데 틀렸습니다 뜨길래


 // 뒤집기
    for ( int j = 0 ; j < M-2; j++) {
        for ( int i = 0 ; i < N-2; i++) {
            if ( ( A[i][j] != B[i][j] ) ) {
                ReverseMatrix(i,j);
                CNT++;
            }
        }
    }


왜 틀리지 하면서 짜증나서 행렬 모든값 검사하는 걸로 코드 바꿧더니 맞았는데 

처음 코드가 아직도 왜 틀린지 모르겠는데 뭐가 문제일까요 ..


혹시 몰라서 전체 코드도 남김


#include <iostream>
#include <string>
using namespace std;

char A[51][51];
char B[51][51];

// 3,3 뒤집기
void ReverseMatrix(int row, int col) {
    for ( int i = 0 ; i < 3; i++) {
        for ( int j = 0 ; j < 3; j++) {
            if (A[row+i][col+j] == '0' )
                A[row+i][col+j] = '1';
            else
                A[row+i][col+j] = '0';
        }
    }
}

int main () {
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);

    int N,M, CNT = 0; // 행,열, 최소 횟수
    cin >> N >> M;

    // 행렬 A,B 입력
    for ( int i = 0  ; i < N ; i++) {
        for ( int j = 0 ; j < M ; j++) {
            cin >> A[i][j];
        }
    }

    for ( int i = 0  ; i < N ; i++) {
        for ( int j = 0 ; j < M ; j++) {
            cin >> B[i][j];
        }
    }

    // 뒤집기
    for ( int j = 0 ; j < M-2; j++) {
        for ( int i = 0 ; i < N-2; i++) {
            if ( ( A[i][j] != B[i][j] ) ) {
                ReverseMatrix(i,j);
                CNT++;
            }
        }
    }

    // A와B가 같은지 확인
    for ( int i = 0 ; i < N; i++) {
        for ( int j = 0 ; j < M; j++) {
            if (A[i][j] != B[i][j]) { // 하나라도 다르면 -1 출력 후 종료
                cout << -1;
                return 0;
            }
        }
    }

    // 같다면 CNT
    cout << CNT;
}