[C++]BOJ 1080 - 행렬

[C++]BOJ 1080 - 행렬

  1. 짝수 번 선택시 원래대로가 되기 때문에 같은 칸을 두 번 이상 선택할 필요가 없다.

  2. 1번 조건을 다르게 생각해보면 선택 순서또한 중요치 않다는 뜻도 된다.

왼쪽 위부터 한자리씩 비교하며 다르면 그 칸을 포함해 오른쪽으로 3, 아래로 3 칸을 바꿔준다.

전체가 같아지면 멈추고 모든 칸을 다 바꿨는데 다르면 -1출력.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<cstdio>
using namespace std;
int n, m;
char a[51][51], b[51][51];
void swap(int i, int j) {
for (int ii = i-1; ii <= i+1; ii++)
for (int jj = j-1; jj <= j+1; jj++)
a[ii][jj] = '0' + '1' - a[ii][jj];
}
bool com(void) {
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (a[i][j] != b[i][j])
return false;
return true;
}
int main(void) {
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%s", a[i]);
for (int i = 0; i < n; i++)
scanf("%s", b[i]);
int cnt = 0;
for (int i = 1; i < n-1; i++)
for (int j = 1; j < m-1; j++)
if (a[i-1][j-1] != b[i-1][j-1]) {
swap(i, j);
cnt++;
}
printf("%d", com()? cnt : -1);
return 0;
}

scanf(“%s”, )를 사용하면 행렬 형태로 담아야 할 char 자료형을 for문 하나로 받아올 수 있다.