본문 바로가기
Computer Science

러시아 국기 같은 깃발

by OKOK 2019. 2. 12.

1. 디피 활용

2. 컴비 활용

3. 나이브 하게

4. 가장 적게 할 수 있는 방법을 고안해서 풀이함 


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
#include <stdio.h>
 
int tc;
 
const int TURE = 1;
const int FALSE = 0;
 
char map[52][52];
enum {WHITE, BLUE, RED};
 
int dp[51][3];
int combi[3];
int minChangedColor = 987654321;
 
void combiAndBacktracking(int order, int beforeIndex, int N, int n_change)
{
    if (order == 1)
    {
        n_change = dp[combi[order - 1]][WHITE];
 
        if (n_change >= minChangedColor)
            return;
    }
 
    if (order == 2)
    {
        n_change = n_change + (dp[combi[order - 1]][BLUE] - dp[combi[order - 2]][BLUE]);
        if (n_change >= minChangedColor)
            return;
 
 
        n_change = n_change + (dp[combi[order]][RED] - dp[combi[order - 1]][RED]);
 
        if (n_change < minChangedColor)
            minChangedColor = n_change;
        return;
    }
 
    for (int i = beforeIndex + 1; i <= (N - 2- (2 - (order + 1)); i++)
    {
        combi[order] = i;
        combiAndBacktracking(order + 1, i, N, n_change);
    }
}
 
int main()
{
    freopen("input.txt""r", stdin);
    setbuf(stdout, NULL);
    scanf("%d"&tc);
 
    for (int testCase = 1; testCase <= tc; testCase++)
    {
        int N, M;
 
        for (int line = 0; line <= 50; line++)
        {
            for (int color = WHITE; color <= RED; color++)
            {
                dp[line][color] = 0;
            }
        }
        minChangedColor = 987654321;
 
        int w = 0;
        int b = 0;
        int r = 0;
 
        scanf("%d %d"&N, &M);
 
        combi[2= N - 1;
 
        for (int y = 0; y < N; y++)
        {
            scanf("%s", map[y]);
            for (int x = 0; x < M; x++)
            {
                switch (map[y][x])
                {
                case 'W':
                    w++;
                    break;
                case 'B':
                    b++;
                    break;
                case 'R':
                    r++;
                    break;
                }
                dp[y][WHITE] = (b + r);
                dp[y][BLUE] = (r + w);
                dp[y][RED] = (b + w);
            }
        }
        combiAndBacktracking(0-1, N, 0);
        printf("%d\n", minChangedColor);
    }
    return 0;
}
cs

 


'Computer Science' 카테고리의 다른 글

배열의 분할  (0) 2019.02.12
재미있는 오셀로 게임  (0) 2019.02.12
늘어지는 소리 만들기  (0) 2019.02.12
콩순이의 가장 싼 팰린드롬  (0) 2019.02.12
테네스의 특별한 소수  (0) 2019.02.12

댓글