char형은 프린트는 %d로 해도 되긴 하는데 스캔하려면 %hhd로 해야한다.
%c 입력받을 때는 %d과는 달리 정수형이 아니라 문자를 받기 때문에 앞의 \n도 받아버린다. 따라서 원하는 입력과 다른 입력을 하게 될 가능성이 높기 때문에 앞의 개행문자나 공백을 무시하기 위해 scanf(" %c", &a);로 입력을 받아준다.
8x8의 체스판 틀을 옮겨가며 검사했다.
흰색으로 시작하든 검은색으로 시작하든 변을 공유하는 칸이 다른 색이기만 하면 되니까 가장 적은 경우의 수를 찾기 위해 흰색인 경우, 검은색인 경우를 둘 다 구하고 비교해서 적은 경우만 남긴다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
char count = 64, count_B = 0, count_W = 0;
char n = 0, m = 0;
char chess[50][50] = { 0, };
int i = 0, j = 0, k = 0, l = 0;
int main()
{
scanf("%hhd %hhd", &m, &n); //행 열
for (int i = 0; i < m; i++) //행
for (int j = 0; j < n; j++) //열
scanf(" %c", &chess[i][j]);
for (i = 0; i <= m - 8; i++) //행
for (j = 0; j <= n - 8; j++) //열
{
count_B = 0; count_W = 0;
for (k = i; k < i + 8; k++)
for (l = j; l < j + 8; l++) {
if (!((k + l) % 2) && (chess[k][l] == 'B')) count_W++;
else if (((k + l) % 2) && (chess[k][l] == 'W')) count_W++;
if (!((k + l) % 2) && (chess[k][l] == 'W')) count_B++;
else if (((k + l) % 2) && (chess[k][l] == 'B')) count_B++;
}
if (count_B > count_W) count_B = count_W;
if (count > count_B) count = count_B;
}
printf("%d\n", count);
for (int i = 0; i < 3; i++) getchar();
return 0;
}