백준 온라인 저지

190316 BOJ 1018번 체스판 다시 칠하기

Stolen Moments 2019. 3. 16. 16:50

BOJ 1018번 체스판 다시 칠하기


브루트 포스, 시뮬레이션


- (0,0)이 'W' 로 시작하는 경우와 'B'로 시작하는 경우로 나눈다.


1번째 경우 : 짝수행의 짝수열에 'W' 홀수열에 'B'가, 홀수행의 짝수열에 'B', 홀수열에 'W'


2번째 경우 : 짝수행의 짝수열에 'B' 홀수열에 'W'가, 홀수행의 짝수열에 'W', 홀수열에 'B'



1번째 경우에 맞는 위치에 있으면 W1, B1 1씩 증가시키고


2번째 경우에 맞는 위치에 있으면 W2, B2 1씩 증가시킨다.


W1 + B1 와 W2 + B2 의 값을 비교해 더 작은 값을 답으로 갱신한다.



*190322

생각해보니 그냥 W1, B1, W2, B2 나누지 않고 


1번째 경우 a++, 2번째 경우 b++ 한 후 min(a,b) 하면 된다 ㅎ ㅎ;;


설명 시작


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <algorithm>
#define FOR(i,a,b) for(int i = a; i < b; i++)
#define MAX 2147000000
using namespace std;
char arr[51][51];
int main() {
    int N, M, ans = MAX;
    cin >> N >> M;
    FOR(i, 0, N) FOR(j, 0, M) cin >> arr[i][j];
    FOR(x, 0, N - 7) FOR(y, 0, M - 7) {
        int W1 = 0, W2 = 0, B1 = 0, B2 = 0;
        FOR(i, x, x + 8) {
            if (i % 2 == 0) {
                FOR(j, y, y + 8) {
                    if (j % 2 == 0 && arr[i][j] == 'W') W1++;
                    else if (j % 2 == 1 && arr[i][j] == 'B') B1++;
                    else if (j % 2 == 0 && arr[i][j] == 'B') B2++;
                    else W2++;
                }
            }
            else {
                FOR(j, y, y + 8) {
                    if (j % 2 == 0 && arr[i][j] == 'B') B1++;
                    else if (j % 2 == 1 && arr[i][j] == 'W') W1++;
                    else if (j % 2 == 0 && arr[i][j] == 'W') W2++;
                    else B2++;
                }
            }
        }
        ans = min(ans, min(W1 + B1, W2 + B2));
    }
    cout << ans;
}
cs



반응형