백준 온라인 저지
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 |
반응형