-
https://www.acmicpc.net/problem/1080
1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
<문제>
3*3씩 토글할때, 왼쪽 위를 기준점으로 잡는다고 생각해보자.
가능한 기준점의 위치는 R : [0, n-2], C : [0, m-2]이다.
어처피 하나의 칸의 버튼을 2번이상 누를 필요는 없으므로, 버튼을 누르거나, 안누르거나 둘중에 하나를 선택해야한다.
다만 기준점이 바뀔 수 있는 타이밍은, 기준점을 토글할때 뿐이므로
버튼을 눌러야 하는가에 대한 판별은, 기준점의 원소가 행렬 B와 다른지로 판별이 가능하다.
이는 아래 코드의 30라인에서 확인 할 수 있다.
<소스코드>
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include <bits/stdc++.h>using namespace std;int n, m, a[51][51], b[51][51];void toggle(int y, int x) {for (int i = y; i <= y + 2; i++) {for (int j = x; j <= x + 2; j++) {a[i][j] = 1 - a[i][j];}}}int main(void) {cin >> n >> m;int i, j;string s;for (i = 0; i < n; i++) {cin >> s;for (j = 0; j < m; j++) {a[i][j] = s[j] - '0';}}for (i = 0; i < n; i++) {cin >> s;for (j = 0; j < m; j++) {b[i][j] = s[j] - '0';}}int answer = 0;for (i = 0; i < n - 2; i++) {for (j = 0; j < m - 2; j++) {if (a[i][j] != b[i][j]) {toggle(i, j);answer++;}}}bool flag = true;for (i = 0; i < n; i++) {for (j = 0; j < m; j++) {if (a[i][j] != b[i][j]) {flag = false;}}}if (flag == true)cout << answer;else if (flag == false)cout << "-1";return 0;}cs 'BOJ' 카테고리의 다른 글
[1449] 수리공 항승 (0) 2021.10.04 [16953] A → B (0) 2021.10.04 [1744] 수 묶기 (0) 2021.10.03 [1059] 좋은 구간 (0) 2021.10.03 [20056] 마법사 상어와 파이어볼 (0) 2021.10.02