1018번 체스판 다시 칠하기

뻔한·2020년 4월 13일
0

Brute force

목록 보기
10/13

문제 링크

체스판 다시 칠하기

문제 풀이

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;
}
profile
ㄷㄷㄷㅈ

0개의 댓글