기술 블로그

1018번 체스판 다시 칠하기 본문

알고리즘 문제/BOJ

1018번 체스판 다시 칠하기

parkit 2018. 12. 14. 10:37
728x90
반응형

https://www.acmicpc.net/problem/1018


브루트 포스 문제이길래

완전한 체스판 2개(하얀 색을 먼저 시작하는 판과 검은 색을 먼저 시작하는 판)를

먼저 준비해 놓고, 입력 받은 판을 [행][열]의 값끼리 비교하여

최솟값을 출력한다.


다만, 마음에 걸리는 것은 정말로 완전한 체스판 2개를 칠해놓고 시작하는 방법 외에


더욱 더 간단하고 보기 쉬운 코드가 있는지 궁금하다. 구글링을 좀 해봐야겠다.



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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
#include <map>
 
using namespace std;
 
int Map1[51][51= { 0, };
int Map2[51][51= { 0, };
 
int v[51][51= { 0, };
 
int N = 0, M = 0;
// 흰 색 = 1, 검은 색 = -1;
 
int dy[2= { 10 };
int dx[2= { 01 };
 
int w = 0, b = 0;
 
void init()
{
    Map1[0][0= 1// 하얀 색 먼저
    Map2[0][0= -1// 검은 색 먼저
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            for (int k = 0; k < 2; k++)
            {
                if (i + dy[k] >= N || j + dx[k] >= M) continue;
 
                Map1[i + dy[k]][j + dx[k]] = Map1[i][j] * -1;
                Map2[i + dy[k]][j + dx[k]] = Map2[i][j] * -1;
            }
        }
    }
}
 
void calc(int r, int c)
{
    int wcnt = 0, bcnt = 0;
 
    for (int i = r; i < r + 8; i++)
    {
        for (int j = c; j < c + 8; j++)
        {
            if (Map1[i][j] != v[i][j]) ++wcnt;
            // 하얀 색을 먼저 칠한 판과 입력 받은 판에서 서로 다른 개수
 
            if (Map2[i][j] != v[i][j]) ++bcnt;
            // 검은 색을 먼저 칠한 판과 입력 받은 판에서 서로 다른 개수
        }
    }
 
    // 최솟값 갱신
    w = min(w, wcnt);
    b = min(b, bcnt);
}
 
int main(void)
{
    char a;
 
    w = b = INT32_MAX;
 
    scanf("%d %d"&N, &M);
 
    init();
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            cin >> a;
 
            if (a == 'W') v[i][j] = 1;        
            else if (a == 'B') v[i][j] = -1;        
        }
    }
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            if (i + 8 > N || j + 8 > M) continue;
 
            calc(i, j);
        }
    }
 
    printf("%d\n", min(w, b));
 
    return 0;
}
cs


728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

1065번 한수  (0) 2018.12.18
2161번 카드1  (0) 2018.12.15
2512번 예산  (0) 2018.12.13
4690번 완전 세제곱  (0) 2018.12.09
10804번 카드 역배치  (0) 2018.12.09