끄적끄적 코딩
article thumbnail
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

검색 태그