본문 바로가기
알고리즘 문제 풀이

[백준] 체스판 다시 칠하기 - 복습

by pinok1o 2021. 1. 31.

https://www.acmicpc.net/problem/1018

전체 체스판을 8 * 8 범위씩 탐색한다고 했을때
8 * 8 안에서 검은색을 먼저 칠하는 경우, 흰색을 먼저 칠하는 경우로 나누어
둘중 최소 값만 남긴다


#include <iostream>
#include <string.h>

using namespace std;

char map[51][51];
char map_[51][51];

int retMin = 987654321;

//black true 이면 B 시작
//black false 이면 W 시작
void makeChessMap(int x, int y, bool black)
{
    memcpy(map_, map, sizeof(map));

    int count = 0;

    for (int i = 0; i < 8; i++)
    {
        if (black == true)
            black = false;
        else
            black = true;

        for (int j = 0; j < 8; j++)
        {
            if (black == true) {//검은색그릴때
                if (map_[x + i][y + j] == 'W') {
                    map_[x + i][y + j] = 'B';
                    count++; //변경횟수
                }
                black = false;
            }
            else { //흰색 그릴때
                if (map_[x + i][y + j] == 'B') {
                    map_[x + i][y + j] = 'W';
                    count++;
                }
                black = true;
            }
        }
    }

    /*for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            cout << map_[x + i][y + j] << " ";
        }cout << endl;
    }*/

    if (count < retMin) {
        retMin = count;
    }
}
int main()
{
    int N, M;
    cin >> N >> M;

    for (int i = 0; i < N; i++)
        cin >> map[i];


    for (int i = 0; i <= N - 8; i++)
    {
        for (int j = 0; j <= M - 8; j++)
        {
            makeChessMap(i, j, true);
            makeChessMap(i, j, false);
        }
    }

    cout << retMin << endl;
}

'알고리즘 문제 풀이' 카테고리의 다른 글

[백준] 보물 - 복습  (0) 2021.02.04
[백준] 수열의 합 - 복습  (0) 2021.01.31
[백준] 제곱 ㄴㄴ 수 - 복습  (0) 2021.01.31
[백준] - 수열 정렬 - 복습  (0) 2021.01.31
[백준] - Contact - 복습  (0) 2021.01.31

댓글