끄적끄적 코딩
article thumbnail
728x90

브루트 포스 문제입니다.

N*M의 배열에서 8*8의 배열을 잘라서 최소한의 변경을 해서 체스판을 만드는 문제입니다.
변경은 B를 W로 바꾸거나 W를 B로 바꾸는 것을 이야기합니다.
체스판은 현재 위치와 인접한 장소는 다른 색이어야 합니다.

8*8모양으로 자른 모든 경우를 계산해보았습니다.
chess[8][8] 배열에 자른 모양을 넣고
B로 시작했을때와 W로 시작했을때에 대한 경우에 대해서 카운트해주었습니다.
그리고 더 적게 카운트된 값을 리턴해주었습니다.

 

<code />
#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

검색 태그