728x90
https://www.acmicpc.net/problem/1080
코드
#include <iostream>
#include <string.h>
#define MAX 50
using namespace std;
void toggle(bool (*arr)[MAX],int n,int m)
{
for(int i=n; i<n+3; i++)
{
for(int j=m; j<m+3; j++)
{
if(arr[i][j])
{
arr[i][j] = false;
}
else
{
arr[i][j] = true;
}
}
}
}
int main(){
int N,M;
string A[MAX];
string B[MAX];
bool ans[MAX][MAX] = {false};
int answer=0;
cin >> N >> M;
for(int n=0 ; n<N; n++)
{
cin >> A[n];
}
for(int n=0; n<N; n++)
{
cin >> B[n];
for(int m=0; m<M; m++)
{
if(A[n][m] == B[n][m])
{
ans[n][m] = true;
}
}
}
if(N < 3 || M < 3)
{
for(int n=0;n<N;n++)
{
for(int m=0;m<M;m++)
{
if(!ans[n][m])
{
cout <<"-1"<<"\n";
return 0;
}
}
}
cout <<"0\n";
return 0;
}
for(int n=0; n<=N-3; n++)
{
for(int m=0; m<=M-3; m++)
{
if(!ans[n][m])
{
toggle(ans,n,m);
answer++;
}
}
}
for(int n=0; n<N; n++)
{
for(int m=0; m<M; m++)
{
if(!ans[n][m])
{
cout << "-1"<<"\n";
return 0;
}
}
}
cout<<answer<<"\n";
return 0;
}
예외
3x3 미만의 행렬에 대해서는 둘이 일치할 경우 -> 0
일치하지않으면 -> -1
을 출력해야하는걸 제대로 처리하지않아 몇번 틀렸다.
핵심
3x3 행렬의 T/F 를 toggle 한 뒤,
F가 남아있는지를 체크하고 F가 남아있다면 가망성없는 경우이므로 -1 이다.
어차피 0~n-3, 0~m-3 에 대해 모두 F를 T로 바꿨을테니
F가 남아있는 경우는 n-2~n-1 , m-2~m-1 에 대해서만 검사하면 되는 줄 알았는데 아닌가보다.
'프로그래밍 > programmers&bj' 카테고리의 다른 글
[C++] 백준 10951번: A+B - 4 (0) | 2020.07.30 |
---|---|
[C++] 백준 4963번: 섬의 개수 (0) | 2020.07.21 |
[C++] 백준 1058번: 친구 (0) | 2020.07.09 |
[C++] 백준 1012번 유기농 배추 (0) | 2020.07.07 |
[C++][알고리즘] 백준 1003번 피보나치 함수 (0) | 2020.06.06 |