W로 시작하는 8 * 8 체스판과 B로 시작하는 8 * 8 체스판 두 개를 미리 만들어놓는다. 그리고 전체 보드판을 이중 for문으로 돌면서 8 * 8 체스판과 정답 두 개와 비교하여 다른 색깔의 수를 세어 가장 작은 값을 구한다.
#include <iostream>
#include <algorithm>
using namespace std;
int N, M;
char board[51][51];
string ansW[8] = {
"WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW",
"WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW"
};
string ansB[8] = {
"BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB",
"BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB"
};
int checkBoard(int y, int x) {
int cnt1 = 0, cnt2 = 0;
for (int i = 0; i < 8; ++i)
for (int j = 0; j < 8; ++j)
if (ansW[i][j] != board[y + i][x + j])
cnt1++;
for (int i = 0; i < 8; ++i)
for (int j = 0; j < 8; ++j)
if (ansB[i][j] != board[y + i][x + j])
cnt2++;
return min(cnt1, cnt2);
}
int solve() {
int ret = 987654321;
for (int i = 0; i <= N - 8; ++i)
for (int j = 0; j <= M - 8; ++j)
ret = min(ret, checkBoard(i, j));
return ret;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
for (int i = 0; i < N; ++i)
cin >> board[i];
cout << solve();
return 0;
}