개발/C++

[BOJ] 1018 - 체스판 다시 칠하기

#include <iostream>
#include <vector>
#define STD_BOARD_SIZE 8

using namespace std;

string getStdBoard(bool isStartW);
int compareString(string a, string b);
int compareBoard(string* board);
string* sliceBoard(string* board, int x, int y);

int main(){
    int n, m;
    cin >> n >> m;
    
    string* board = new string[n];
    for(int i = 0; i < n; i++){
        cin >> board[i];
    }

    int smallest = n * m;
    for(int i = 0; i < n - STD_BOARD_SIZE + 1; i++){
        for(int j = 0; j < m - STD_BOARD_SIZE + 1; j++){
            string* slicedBoard = sliceBoard(board, j, i);
            int tmp = compareBoard(slicedBoard);
            if(smallest > tmp)  smallest = tmp;
        }
    }

    cout << smallest << endl;
}

string getStdBoard(bool isStartW){
    string w = "WBWBWBWB";
    string b = "BWBWBWBW";
    if(isStartW)    return w;
    else            return b;
}

int compareString(string a, string b){
    int diff = 0;
    for(int i = 0; i < STD_BOARD_SIZE; i++){
        if(a[i] != b[i]) diff++;
    }
    return diff;
}

int compareBoard(string* board){
    int whiteStart = 0;
    int blackStart = 0;
    bool colorFlag = true;
    for(int i = 0; i < STD_BOARD_SIZE; i++){
        whiteStart += compareString( getStdBoard(colorFlag), board[i] );
        blackStart += compareString( getStdBoard(!colorFlag), board[i] );
        colorFlag = !colorFlag;
    }

    if(whiteStart < blackStart) return whiteStart;
    else return blackStart;
}

string* sliceBoard(string* board, int x, int y){
    string* tmp = new string[STD_BOARD_SIZE];
    for(int i = 0; i < STD_BOARD_SIZE; i++){
        tmp[i] = board[y + i].substr(x, x + 8);
    }

    return tmp;
}

'개발 > C++' 카테고리의 다른 글

[BOJ] 1654 - 랜선 자르기  (0) 2021.12.30
[BOJ] 1436 - 영화감독 숌  (0) 2021.12.30
[BOJ] 1181 - 단어정렬  (0) 2021.12.09
[BOJ] 1259 - 팰린드롬수  (0) 2021.12.09
[BOJ] 1085 - 직사각형에서 탈출  (0) 2021.12.09