https://www.acmicpc.net/problem/1018
체스판의 두 가지 경우 - 맨 왼쪽 위 칸이 검은색인 경우, 흰색인 경우를 각각 BW, WB라는 이름의 string 배열로 만들어두고, 브루트포스 방식으로 입력받은 보드와 비교했다.
8*8 크기로 자른 보드를 BW, WB와 비교해서 각 경우의 칠해야 할 칸 수를 구한 후, 그 두 경우 중 최소값을 구한다.
이 과정을 보드 전체적으로 수행한 후 최종 최소값을 도출한다.
#include <iostream>
#include <vector>
using namespace std;
vector<string> board;
string BW[8] = {
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB"
};
string WB[8] = {
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW"
};
int diffBW(int r, int c) {
int diff = 0;
for(int i=0; i<8; i++) {
for(int j=0; j<8; j++) {
if(board[r+i][c+j] != BW[i][j]) diff++;
}
}
return diff;
}
int diffWB(int r, int c) {
int diff = 0;
for(int i=0; i<8; i++) {
for(int j=0; j<8; j++) {
if(board[r+i][c+j] != WB[i][j]) diff++;
}
}
return diff;
}
int main()
{
int N, M;
cin >> N >> M;
cin.ignore();
for(int i=0; i<N; i++) {
string s;
cin >> s;
board.push_back(s);
}
int minDiff = 100;
for(int i=0; i+8<=N; i++) {
for(int j=0; j+8<=M; j++) {
int diff = min(diffBW(i, j), diffWB(i, j));
if(diff < minDiff) minDiff = diff;
}
}
cout << minDiff;
return 0;
}