N coding

4217_신성문자 본문

PS

4217_신성문자

NYWOO19 2018. 8. 30. 14:01

구현문제
나는 삼성 B형 연습중이었어서 dfs말고 bfs쓰고, queue도 직접 구현하였다.
디코딩하고 그림을 찾아내면 된다.
그림은 그 내부의 빈공간의 개수를 기준으로 찾으면 됨.

나는 일단 검은부분을 각각 idx를 올리면서 구해주고 - 각각의 그림은 다른 값을 갖게됨
다음으로 하얀부분에 들어가는데 그 하얀부분이 만나는 검은 부분의 값이 한 개일때 idx의 내부빈공간++을 해줌
그리고 counting sort로 출력~!
(외부로 나가는 건 또 따로 처리)


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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <iostream>
using namespace std;
 
struct pair2 {
    int y, x;
    pair2(int y = 0int x = 0) : y(y), x(x) {}
};
 
class queue2 {
private:
    pair2 arr[100001];
    int l, r, cap;
public:
    queue2() {
        l = 0; r = 0; cap = 100000;
    }
    pair2 front() {
        if (l > r) return pair2();
        return arr[l];
    }
    void pop() {
        if (l == r) return//empty
        l = (l + 1) % cap;
    }
    void push(int y, int x) {
        if ((r + 1) % cap == l) return//overflow;
        arr[r].y = y; arr[r].x = x;
        r = (r + 1) % cap;
    }
    void clear() {
        l = r;
    }
    bool empty() {
        return l == r;
    }
};
 
//A - 1개 , J - 3개, D - 5개, S - 4개 , W - 0개 , K - 2개
int H, W, cnt;
char origin[201][51];
int visit[201][250], a[8= { -110000-11 };
int words[25000], res[27], paint[250][250];
 
int bfs(int y, int x, int t) {
    if (t == 0++cnt;
    queue2 q;
    //queue<pair<int, int>> q;
    q.push( y, x );
    if (t == 0) visit[y][x] = cnt;
    else visit[y][x] = -2;
 
    int what = -1, count = 0;
    while (!q.empty()) {
        y = q.front().y;
        x = q.front().x; q.pop();
 
        for (int i = 0; i < 4++i) {
            int ny = y + a[i];
            int nx = x + a[i + 4];
            if (ny < 0 || nx < 0 || ny >= H || nx >= 4 * W) {
                if (what != -2) {
                    what = -2; count++;
                }
                continue;
            }
            if (paint[ny][nx] == 1 && !visit[ny][nx] && t == 0) {
                visit[ny][nx] = cnt;
                q.push(ny, nx);
            }
            if (paint[ny][nx] == 0 && !visit[ny][nx] && t == 1) {
                visit[ny][nx] = -2;
                q.push(ny, nx);
            }
            else if (paint[ny][nx] == 1 && t == 1) {
                if (what != visit[ny][nx]) {
                    what = visit[ny][nx];
                    count++;
                }
            }
        }
    }
 
    if (t == 1) {
        if (what > -1 && count == 1) {
            return what;
        }
        else return 0;
    }
 
    return 0;
}
 
int func(char c) {
    if (c >= '0' && c <= '9'return c - '0';
    if (c >= 'a' && c <= 'f'return c - 'a' + 10;
}
int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);
 
    int test = 0;
    while (1) {
        test++;
        cin >> H >> W;
        if (!&& !W) return 0;
        for (int i = 0; i < H; ++i) {
            for (int j = 0; j < 4*W; ++j) {
                visit[i][j] = 0;
            }
        }
 
        cnt = 0;
        for (int i = 0; i < H; ++i) cin >> origin[i];
 
        for (int i = 0; i < H; ++i) {
            for (int j = 0; j < W; ++j) {
                int tmp = func(origin[i][j]);
                for (int k = 3; k >= 0--k) {
                    paint[i][j * 4 + k] = tmp % 2; tmp /= 2;
                }
            }
        }
 
        for (int i = 0; i < H; ++i) {
            for (int j = 0; j < W*4++j) {
                if (paint[i][j] == 1 && !visit[i][j]) {
                    bfs(i, j, 0);
                }
            }
        }
 
        for (int i = 0; i < H; ++i) {
            for (int j = 0; j < W * 4++j) {
                if (paint[i][j] == 0 && !visit[i][j]) {
                    int tmp = bfs(i, j, 1);
                    if (tmp != 0) {
                        words[tmp]++;
                    }
                }
            }
        }
 
        for (int i = 1; i <= cnt; ++i) {
            if (words[i] == 1) res[0]++;
            else if (words[i] == 3) res['J' - 'A']++;
            else if (words[i] == 5) res['D' - 'A']++;
            else if (words[i] == 4) res['S' - 'A']++;
            else if (words[i] == 0) res['W' - 'A']++;
            else if (words[i] == 2) res['K' - 'A']++;
            words[i] = 0;
        }
        cout << "Case " << test << ": ";
        for (int i = 0; i < 26++i) {
            for (int j = 0; j < res[i]; ++j){
                cout << (char)(i + 'A');
            }
            res[i] = 0;
        }
        cout << '\n';
 
    }
 
 
}
cs


'PS' 카테고리의 다른 글

13576_Prefix와 Suffix  (0) 2018.08.31
2809_아스키거리  (3) 2018.08.30
15940_네트워크 연결  (2) 2018.08.29
3654_L퍼즐  (0) 2018.08.29
3789_Hidden password  (0) 2018.08.29