728x90
브루트 포스 문제입니다.
N*M의 배열에서 8*8의 배열을 잘라서 최소한의 변경을 해서 체스판을 만드는 문제입니다.
변경은 B를 W로 바꾸거나 W를 B로 바꾸는 것을 이야기합니다.
체스판은 현재 위치와 인접한 장소는 다른 색이어야 합니다.
8*8모양으로 자른 모든 경우를 계산해보았습니다.
chess[8][8] 배열에 자른 모양을 넣고
B로 시작했을때와 W로 시작했을때에 대한 경우에 대해서 카운트해주었습니다.
그리고 더 적게 카운트된 값을 리턴해주었습니다.
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char map[60][60];
char chess[8][8];
int solve()
{
int countWB = 0;
int countBW = 0;
for (int i = 0; i < 8; ++i) {
for (int j = 0; j < 8; ++j) {
if ((i + j) % 2 == 0 && chess[i][j] == 'W') {
++countBW;
}
if ((i + j) % 2 == 1 && chess[i][j] == 'B') {
++countBW;
}
if ((i + j) % 2 == 0 && chess[i][j] == 'B') {
++countWB;
}
if ((i + j) % 2 == 1 && chess[i][j] == 'W') {
++countWB;
}
}
}
return min(countWB, countBW);
}
void input(int x, int y)
{
for (int i = 0; i < 8; ++i) {
for (int j = 0; j < 8; ++j) {
chess[i][j] = map[x + i][y + j];
}
}
}
int main(int argc, char *argv[])
{
int n, m;
int minChange = 987654321;
memset(map, 0, sizeof(map));
cin >> n;
cin >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> map[i][j];
}
}
for (int i = 0; i <= n - 8; ++i) {
for (int j = 0; j <= m - 8; ++j) {
input(i, j);
minChange = min(minChange, solve());
}
}
cout << minChange << endl;
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 1541번 잃어버린 괄호 (0) | 2019.09.02 |
---|---|
[C++] 백준 1436번 영화감독 숌 (0) | 2019.09.02 |
[C++] 백준 7568번 덩치 (0) | 2019.09.02 |
[C++] 백준 2231번 분해합 (0) | 2019.09.01 |
[C++] 백준 2798번 블랙잭 (0) | 2019.09.01 |