๐Ÿ’ป

[๋ฐฑ์ค€][์‚ผ์„ฑ SW์—ญ๋Ÿ‰ ํ…Œ์ŠคํŠธ] 15683. ๊ฐ์‹œ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ œํ’€์ด Baekjoon

[๋ฐฑ์ค€][์‚ผ์„ฑ SW์—ญ๋Ÿ‰ ํ…Œ์ŠคํŠธ] 15683. ๊ฐ์‹œ

๋˜ํšจ๋‹ˆ 2020. 4. 25. 18:10

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

 

15683๋ฒˆ: ๊ฐ์‹œ

์Šคํƒ€ํŠธ๋งํฌ์˜ ์‚ฌ๋ฌด์‹ค์€ 1×1ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋Š” N×M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ๋ฌด์‹ค์—๋Š” ์ด K๊ฐœ์˜ CCTV๊ฐ€ ์„ค์น˜๋˜์–ด์ ธ ์žˆ๋Š”๋ฐ, CCTV๋Š” 5๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ๊ฐ CCTV๊ฐ€ ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 1๋ฒˆ CCTV๋Š” ํ•œ ์ชฝ ๋ฐฉํ–ฅ๋งŒ ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. 2๋ฒˆ๊ณผ 3๋ฒˆ์€ ๋‘ ๋ฐฉํ–ฅ์„ ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, 2๋ฒˆ์€ ๊ฐ์‹œํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์„œ๋กœ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์ด์–ด์•ผ ํ•˜๊ณ , 3๋ฒˆ์€ ์ง๊ฐ ๋ฐฉํ–ฅ์ด์–ด์•ผ ํ•œ๋‹ค. 4๋ฒˆ์€ ์„ธ ๋ฐฉํ–ฅ, 5๋ฒˆ์€ ๋„ค ๋ฐฉํ–ฅ์„ ๊ฐ์‹œํ• 

www.acmicpc.net

 

๋ฌธ์ œ

์œ„์˜ ๋งํฌ ์ฐธ์กฐ

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์‚ฌ๋ฌด์‹ค์˜ ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N, M ≤ 8)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์‚ฌ๋ฌด์‹ค ๊ฐ ์นธ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ์นธ, 6์€ ๋ฒฝ, 1~5๋Š” CCTV๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ๋ฌธ์ œ์—์„œ ์„ค๋ช…ํ•œ CCTV์˜ ์ข…๋ฅ˜์ด๋‹ค. 

CCTV์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” 8๊ฐœ๋ฅผ ๋„˜์ง€ ์•Š๋Š”๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์‚ฌ๊ฐ ์ง€๋Œ€์˜ ์ตœ์†Œ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ1

4 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 6 0
0 0 0 0 0 0

 

์˜ˆ์ œ ์ถœ๋ ฅ1

20

 

์ƒ๊ฐ

na 982 ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ํ’€์—ˆ๋‹ค.

 

1๋ฒˆ ์นด๋ฉ”๋ผ์˜ ๊ฒฝ์šฐ : 4๋ฐฉํ–ฅ

2๋ฒˆ ์นด๋ฉ”๋ผ์˜ ๊ฒฝ์šฐ : 2๋ฐฉํ–ฅ

3๋ฒˆ ์นด๋ฉ”๋ผ์˜ ๊ฒฝ์šฐ : 4๋ฐฉํ–ฅ

4๋ฒˆ ์นด๋ฉ”๋ผ์˜ ๊ฒฝ์šฐ : 4๋ฐฉํ–ฅ

5๋ฒˆ ์นด๋ฉ”๋ผ์˜ ๊ฒฝ์šฐ : 1๋ฐฉํ–ฅ

 

1. ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ณ„์‚ฐํ•˜๊ธฐ

์ตœ์•…์˜ ๊ฒฝ์šฐ๋Š” ์นด๋ฉ”๋ผ๊ฐ€ ์ด 8๋Œ€ ์ด๊ธฐ ๋•Œ๋ฌธ์— 4^8 = 65536 ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ ,

๋งค ๊ฒฝ์šฐ๋งˆ๋‹ค ์‚ฌ๋ฌด์‹ค์˜ ์ตœ๋Œ€ ํฌ๊ธฐ 8*8 ์—์„œ ๊ฐ์‹œ ๋ชปํ•˜๋Š” ๊ณต๊ฐ„์„ ์นด์šดํŠธ ํ•˜๋ฉด 65536 * 64 = ์•ฝ 400๋งŒ

=> ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ์ž˜ ํ•ด์ค˜์•ผํ•œ๋‹ค. 

 

2. ๊ฐ์‹œ ์นด๋ฉ”๋ผ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ํšŒ์ „๊ฐ€๋Šฅํ•œ ๋ฐฉํ–ฅ์˜ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•œ๋‹ค.

const int rot_size[] = { 4, 2, 4, 4, 1 };

 

์ž‘์„ฑํ•œ ์ฝ”๋“œ

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
// ๊ฐ์‹œ
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
 
using namespace std;
 
struct CCTV
{
    int type, y, x;
};
 
int n, m, ans;
int map[8][8];
int cctv_size;
CCTV cctv[8];
 
const int rot_size[] = {42441};
 
void map_copy(int desc[8][8], int src[8][8])
{
    for (int y = 0; y < n; y++)
    {
        for (int x = 0; x < m; x++)
        {
            desc[y][x] = src[y][x];
        }
    }
}
// dir =>  0(์˜ค) 1(์œ„) 2(์™ผ) 3(์•„)
void update(int dir, CCTV cctv)
{
    dir = (dir % 4);
 
    if (dir == 0)
    {
        for (int x = cctv.x + 1; x < m; x++)
        {
            if (map[cctv.y][x] == 6)
                break;
            map[cctv.y][x] = -1;
        }
    }
    if (dir == 1)
    {
        for (int y = cctv.y - 1; y >= 0; y--)
        {
            if (map[y][cctv.x] == 6)
                break;
            map[y][cctv.x] = -1;
        }
    }
    if (dir == 2)
    {
        for (int x = cctv.x - 1; x >= 0; x--)
        {
            if (map[cctv.y][x] == 6)
                break;
            map[cctv.y][x] = -1;
        }
    }
    if (dir == 3)
    {
        for (int y = cctv.y + 1; y < n; y++)
        {
            if (map[y][cctv.x] == 6)
                break;
            map[y][cctv.x] = -1;
        }
    }
}
void dfs(int cctv_index)
{
    if (cctv_index == cctv_size)
    {   
        // ์‚ฌ๊ฐ์ง€๋Œ€ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ
        int cnt = 0;
        for (int y = 0; y < n; y++)
        {
            for (int x = 0; x < m; x++)
            {
                if (map[y][x] == 0)
                {
                    cnt++;
                }
            }
        }
        if (ans > cnt)
        {
            ans = cnt;
        }
 
        return;
    }
    int backup[8][8];
    int type = cctv[cctv_index].type;
    for (int dir = 0; dir < rot_size[type]; dir++)
    {
        // map ๋ฐฑ์—…ํ•˜๊ธฐ
        map_copy(backup, map);
        // map ์—…๋ฐ์ดํŠธ
        if (type == 0)
        {
            update(dir, cctv[cctv_index]);
        }
        else if (type == 1)
        {
            update(dir, cctv[cctv_index]);
            update(dir + 2, cctv[cctv_index]);
        }
        else if (type == 2)
        {
            update(dir, cctv[cctv_index]);
            update(dir + 1, cctv[cctv_index]);
        }
        else if (type == 3)
        {
            update(dir, cctv[cctv_index]);
            update(dir + 1, cctv[cctv_index]);
            update(dir + 2, cctv[cctv_index]);
        }
        else if (type == 4)
        {
            update(dir, cctv[cctv_index]);
            update(dir + 1, cctv[cctv_index]);
            update(dir + 2, cctv[cctv_index]);
            update(dir + 3, cctv[cctv_index]);
        }
        dfs(cctv_index + 1);
        // map ์›์ƒ๋ณต๊ท€
        map_copy(map, backup);
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    cin >> n >> m;
    for (int y = 0; y < n; y++)
    {
        for (int x = 0; x < m; y++)
        {
            cin >> map[y][x];
            
            if (map[y][x] != 0 && map[y][x] != 6)
            {
                cctv[cctv_size].y = y;
                cctv[cctv_size].x = x;
                cctv[cctv_size].type = map[y][x] - 1// 0๋ฒˆ๋ถ€ํ„ฐ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ
                cctv_size++;
            }
        }
    }
 
    ans = 100;
    dfs(0);
 
    cout << ans << "\n";
    return 0;
}
Colored by Color Scripter
๋ฐ˜์‘ํ˜•
Comments