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 |
댓글