728x90
728x90
https://www.acmicpc.net/problem/1080
난이도: solved.ac 실버 1
(주의해야할 점)
행렬을 입력받을 때
1 1 0
0 1 0
0 1 0
처럼 한 칸씩 띄어져 있는게 아니라
110
010
010
처럼 붙여있는 형태라 "%1d"로 입력받아야 숫자 하나당 scanf를 할 수 있다
행렬의 크기가 3*3보다 작을 때는 무조건 -1를 출력하는 게 아니라
두 행렬이 같을 때는 0을 출력한다
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int N, M, i, j;
scanf("%d %d", &N, &M);
int** matrix = (int**)calloc(N, sizeof(int*));
for (i = 0; i < N; i++)
matrix[i] = (int*)calloc(M, sizeof(int));
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
scanf("%1d", &matrix[i][j]);
int num, cnt = 0;
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
scanf("%1d", &num);
if (num == matrix[i][j]) // 같은 부분은 0로 표시
matrix[i][j] = 0;
else
matrix[i][j] = 1; // 다른 부분은 1로 표시
}
}
if (N < 3 || M < 3) { // 행렬의 크기가 3*3보다 작은 경우
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
if (matrix[i][j] == 1) {
printf("-1"); // 못 뒤집으므로
return 0;
}
}
}
printf("0"); // 두 행렬이 같은 경우
return 0;
}
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
if (matrix[i][j] == 1) {
if (i > N - 3 || j > M - 3) { // 다른 부분(1)이 각 모서리로부터 2칸 안에 있을 때
printf("-1");
return 0;
}
else {
for (int x = i; x < i + 3; x++)
for (int y = j; y < j + 3; y++)
matrix[x][y] = !matrix[x][y];
cnt++;
}
}
}
}
printf("%d", cnt);
for (i = 0; i < N; i++)
free(matrix[i]);
free(matrix);
return 0;
}
반응형