๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/nํšŒ๋…

[BOJ] #14502 ์—ฐ๊ตฌ์†Œ

by dar0m! 2020. 4. 23.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
 2 ์ดˆ  512 MB 54.624%
 

14502๋ฒˆ: ์—ฐ๊ตฌ์†Œ

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์•„์ง ํผ์ง€์ง€ ์•Š์•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค์˜ ํ™•์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์—ฐ๊ตฌ์†Œ์— ๋ฒฝ์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ํฌ๊ธฐ๊ฐ€ N×M์ธ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง์‚ฌ๊ฐํ˜•์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ๋นˆ ์นธ, ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๋ฒฝ์€ ์นธ ํ•˜๋‚˜๋ฅผ ๊ฐ€๋“ ์ฐจ์ง€ํ•œ๋‹ค.  ์ผ๋ถ€ ์นธ์€ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋นˆ ์นธ์œผ๋กœ ๋ชจ๋‘ ํผ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

www.acmicpc.net

๋ฌธ์ œ

0 : ๋นˆ ์นธ 1 : ๋ฒฝ 2 : ๋ฐ”์ด๋Ÿฌ์Šค

๋กœ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ €๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ 3๊ฐœ์˜ ๋ฒฝ์„ ์„ธ์›Œ์•ผ ํ•œ๋‹ค. 
์ด ๋•Œ 0์ธ ๋ถ€๋ถ„์„ ์•ˆ์ „ ์˜์—ญ์ด๋ผํ•˜๊ณ  ์•ˆ์ „ ์˜์—ญ ํฌ๊ธฐ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฒ˜์Œ ์•„์ด๋””์–ด๋Š” 2๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฒฝ์„ ํ•˜๋‚˜์”ฉ ์„ธ์›Œ๋ณผ๊นŒ ํ–ˆ๋‹ค๊ฐ€ ์–ด์จŒ๋“  ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ๋ด์•ผํ•˜๋ฏ€๋กœ 0 ์ธ ์นธ๋“ค์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฒฝ์„ ์„ธ์šฐ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ–ˆ๋‹ค.

3 ≤ n, m 8

ํ•ด๊ฒฐ

key point, ๋ธŒ๋ฃจํŠธ ํฌ์Šค๋กœ ๋ฒฝ์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ณณ์— ๋ฒฝ์„ ์„ธ์›Œ๋‘” ํ›„ BFS๋กœ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผํŠธ๋ฆฐ๋‹ค.
  1. ๋ฐ”์ด๋Ÿฌ์Šค ์œ„์น˜๋ฅผ virus ํ์— ์ €์žฅํ•œ๋‹ค.
  2. ๋ฐ˜๋“œ์‹œ ๋ฒฝ์„ 3๊ฐœ ์„ธ์›Œ์•ผ ํ•˜๋ฏ€๋กœ lab( cnt, r, c ) ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฒฝ 3๊ฐœ๋ฅผ ์„ธ์šฐ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•œ๋‹ค.
  3. ์›๋ž˜ ๋ฐฐ์—ด์—์„œ 0์ธ ๊ณณ์—๋งŒ ๋ฒฝ์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋‹ค. lab(cnt-1, nr, nc)
  4. ์›๋ž˜ ๋ฐฐ์—ด์—์„œ 0์ธ ๊ณณ์—๋Š” ๋ฒฝ์„ ์„ธ์šธ ์ˆ˜ ์žˆ๊ธฐ๋„ํ•˜๊ณ  ์•ˆ์„ธ์šธ ์ˆ˜๋„ ์žˆ๋‹ค. lab(cnt, nr, nc)
  5. cnt๊ฐ€ 0์ผ ๋•Œ ๋ฒฝ์„ ์„ธ๊ฐœ ๋ชจ๋‘ ์„ธ์› ์œผ๋ฏ€๋กœ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผํŠธ๋ฆฐ๋‹ค → BFS
  6. ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋ชจ๋‘ ํผ์ง„ ํ›„ 0์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ ans ์™€ ๋น„๊ตํ•˜์—ฌ ๋” ํฐ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ์‹œํ‚จ๋‹ค.

๋ฒฝ 3๊ฐœ๋ฅผ ์„ธ์šฐ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ํƒ์ƒ‰ํ•œ ํ›„ ์ตœ์ข…์ ์œผ๋กœ ๊ฐ–๊ฒŒ ๋˜๋Š” ans๋Š” ์ตœ์ ์ด ๋‹ต์ด ๋œ๋‹ค.

 

ํ•ด๊ฒฐ์— ๋„์›€๋œ testcase

3 4
0 2 1 0
0 1 1 2
0 0 1 0

3 4
Y 2 X Y
0 X X 2
0 0 X Y
์ถœ๋ ฅ: 3

 

if (r >= n) return;

ํ˜„์žฌ 36๋ฒˆ์งธ ์ค„์— ์žˆ๋Š” ๋ฌธ์žฅ์ด
labํ•จ์ˆ˜ ๋งจ ์œ„(9๋ฒˆ์งธ ์ค„)์— ์œ„์น˜ํ•˜๊ณ  ์žˆ์–ด์„œ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋‹ต์ด 2๊ฐ€ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋‹ˆ ํ•ด๊ฒฐ.

 

์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
 1984 KB 44 ms
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
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
typedef pair<intint> p;
queue<p> virus;
int n, m, arr[10][10], dx[] = { 0,0,1,-1 }, dy[] = { 1,-1,0,0 }, chk[10][10], ans;
void lab(int cnt, int r, int c) {
    if (cnt == 0) {
        queue<p> vir = virus;
        // BFS ์ง„ํ–‰
        while (!vir.empty()) {
            p front = vir.front();
            int x = front.first, y = front.second;
            chk[x][y] = 1;
            vir.pop();
            for (int k = 0; k < 4; k++) {
                int nx = x + dx[k], ny = y + dy[k];
                if (nx < 0 || ny < 0 || nx >= n || ny >= m || arr[nx][ny] > 0 || chk[nx][ny]) continue;
                chk[nx][ny] = 1;
                vir.push({ nx, ny });
            }
        }
        // 0๊ฐœ์ˆ˜ ์„ธ๊ธฐ
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (arr[i][j] == 0 && chk[i][j] == 0) cnt++;
            }
        }
        // ans ๊ฐฑ์‹ 
        ans = cnt > ans ? cnt : ans;
        memset(chk, 0sizeof(chk));
        return;
    }
    if (r >= n) return;
    int nr = c + 1 >= m ? r + 1 : r;
    int nc = c + 1 >= m ? 0 : c + 1;
    if (arr[r][c] == 0) {
        arr[r][c] = 1;
        lab(cnt - 1, nr, nc);
        arr[r][c] = 0;
    }
    lab(cnt, nr, nc);
}
 
int main() {
    scanf("%d %d"&n, &m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d"&arr[i][j]);
            if (arr[i][j] == 2) virus.push({ i,j });
        }
    }
    lab(300);
    printf("%d", ans);
    return 0;
}
cs

'๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ > nํšŒ๋…' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] #1012 ์œ ๊ธฐ๋† ๋ฐฐ์ถ”  (0) 2020.05.03
[BOJ] #1158 ์š”์„ธํ‘ธ์Šค ๋ฌธ์ œ  (0) 2020.05.02

๋Œ“๊ธ€