https://www.acmicpc.net/problem/1080
이 문제인데
전 행렬변환이 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;
}
위에거는 이거 답 안나올거 같은데 4 4 0000 0000 0000 0000 1001 0000 0000 1001
아 3칸 모두 안 다르면 무조건 변환불가라고 생각했는데 ..ㄳㄳ