๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Gold

[BOJ] 17142 : ์—ฐ๊ตฌ์†Œ 3

by Jaeguk 2022. 5. 17.
๋ฌธ์ œ ๋งํฌ

17142๋ฒˆ: ์—ฐ๊ตฌ์†Œ 3 (acmicpc.net)

 

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

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์— ์Šน์›์ด๊ฐ€ ์นจ์ž…ํ–ˆ๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์œ ์ถœํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ํ™œ์„ฑ ์ƒํƒœ์™€ ๋น„ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ์žˆ๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ๋ชจ๋“  ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ๋น„ํ™œ์„ฑ ์ƒํƒœ์ด๊ณ 

www.acmicpc.net

 ์—ฐ๊ตฌ์†Œ ๋ชจ๋“  ์นธ์— ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผํŠธ๋ฆฌ๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” BFS ๋ฌธ์ œ.

ํ’€์ด

 ์—ฐ๊ตฌ์‹ค์„ N X N ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ํ‘œํ˜„ํ–ˆ์„ ๋•Œ ๊ฐ ์นธ์€ 0 ๋นˆ ์นธ, 1 ๋ฒฝ, 2 ๋ฐ”์ด๋Ÿฌ์Šค ์ค‘์— ํ•˜๋‚˜๋กœ ์ฑ„์›Œ์ง„๋‹ค.

 ๋ฐ”์ด๋Ÿฌ์Šค์—๋Š” ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค์™€ ๋น„ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋‹ค. ๋‘˜๋‹ค ๋ฐ”์ด๋Ÿฌ์Šค์ง€๋งŒ ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ „์—ผ์„ฑ์„ ๊ฐ€์ง€๊ณ  ๋น„ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ „์—ผ์„ฑ์ด ์—†๋‹ค. ํ•˜์ง€๋งŒ ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋น„ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค์™€ ๋งŒ๋‚˜๋ฉด ํ™œ์„ฑํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 2 ~ 10๊ฐœ ์‚ฌ์ด์˜ ๋ฐ”์ด๋Ÿฌ์Šค ์ค‘์— ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” M๊ฐœ ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 ๋ฐ”์ด๋Ÿฌ์Šค๋“ค ์ค‘์— ์–ด๋–ค M๊ฐœ์˜ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„๋‚ด์— ์—ฐ๊ตฌ์†Œ๋ฅผ ๋ฐ”์ด๋Ÿฌ์Šค๋กœ ๊ฐ€๋“ ์ฑ„์šธ ์ˆ˜ ์žˆ์„ ์ง€ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

 ์—ฌ๊ธฐ์„œ ์–ด๋–ป๊ฒŒ M๊ฐœ๋ฅผ ์„ ํƒํ•ด์•ผ์ง€ ๋น ๋ฅด๊ฒŒ ์ „์—ผ์‹œํ‚ค๋Š”๋ฐ ์œ ๋ฆฌํ• ์ง€๋Š” ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ํ•ด๋ณด์•„์•ผํ•œ๋‹ค.

 ๋‚˜๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•ด์„œ ์„ ํƒํ•œ ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ M๊ฐœ๊ฐ€ ๋˜๋ฉด BFS๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋“  ์นธ์— ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผํŠธ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€, ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฌ๋Š” ์ง€ ์ฒดํฌํ•ด์„œ ์ตœ๋‹จ์‹œ๊ฐ„์„ ์ฐพ์•˜๋‹ค.

for (int i = idx; i < virus.size(); i++) {
		active_virus.push_back(virus[i]);
		backtracking(depth + 1, i + 1);
		active_virus.pop_back();
}

 active_virus๋Š” ํ™œ์„ฑํ™” ์‹œํ‚ฌ ๋ฐ”์ด๋Ÿฌ์Šค์˜ ์ขŒํ‘œ๋ฅผ ๋ชจ์•„๋†“์€ ๋ฒกํ„ฐ์ด๋‹ค. ์ด ๋ฒกํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ M์ด ๋˜๋ฉด M๊ฐœ๋ฅผ ์„ ํƒํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋กœ M๊ฐœ์˜ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

M๊ฐœ๋ฅผ ๋ชจ๋‘ ์„ ํƒํ–ˆ๋‹ค๋ฉด ์ด์ œ BFS๋กœ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•ด์•ผํ•œ๋‹ค. BFS๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์€ ๋ฒฝ์ด ์•„๋‹Œ ์นธ๋“ค ์ค‘ ์ด์ „์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋˜ ์นธ๋“ค๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์•ˆ๋œ๋‹ค.

Q. ๋ชจ๋“  ์นธ์— ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์กŒ๋Š”์ง€๋Š” ์–ด๋–ป๊ฒŒ ์ฒดํฌํ• ๊นŒ?

A. ์ดˆ๊ธฐ ์ž…๋ ฅ์‹œ์— ๋นˆ ์นธ์˜ ์ˆ˜ ์ฆ‰ 0์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•ด๋‘๊ณ , ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋นˆ ์นธ์— ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํผํŠธ๋ฆฌ๊ฒŒ๋˜๋ฉด ์ด ๊ฐœ์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ์ค„์—ฌ๋‚˜๊ฐ„๋‹ค. ๋งŒ์•ฝ ๋‚จ์€ ๋นˆ ์นธ์˜ ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋“  ์นธ์— ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์กŒ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ, ์ด๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ์ฒดํฌํ•ด์„œ ์ตœ์†Œ์‹œ๊ฐ„์„ ์ฐพ๋Š”๋‹ค.

 ์ฒ˜์Œ์—๋Š” ์œ„ ๋ฐฉ๋ฒ•๋Œ€๋กœ ํ•˜์ง€์•Š์•„์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค. ์ฒ˜์Œ์—” ๋ฐฉ๋ฌธ๋˜์ง€์•Š์€ ๋น„ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ๋งŒ๋‚˜๋ฉด ์ด ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํ™œ์„ฑ์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ํ–ˆ๋‹ค.

5 1
2 2 2 1 1
2 1 1 1 1
2 1 1 1 1
2 1 1 1 1
2 2 2 1 1

๊ทธ๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋˜๋ฉด ๋งˆ์ง€๋ง‰ ์˜ˆ์ œ์—์„œ ์ด๋ฏธ ๋ชจ๋“  ์นธ์ด ๋นˆ ์นธ ์—†์ด ๋ฐ”์ด๋Ÿฌ์Šค๋กœ ์ฑ„์›Œ์กŒ๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๋น„ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ๋งŒ๋‚˜๋ฉด ํ™œ์„ฑํ™” ์‹œํ‚ค๋ฏ€๋กœ ์ด๋•Œ์˜ ์‹œ๊ฐ„์ด ๊ณ„์‚ฐ๋œ๋‹ค. ๊ทธ๋ž˜์„œ 4๋ผ๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ๋น„ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ๋” ์ด์ƒ ํƒ์ƒ‰์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด?

5 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
0 2 0 2 0
1 1 1 1 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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef priority_queue<pair<intint>vector<pair<intint>>, greater<pair<intint>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 50 + 5;
int lab[MAX_N][MAX_N];
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
int N, M;
vector<pair<intint>> virus;
vector<pair<intint>> active_virus;
bool visited[MAX_N][MAX_N];
int ans = INF;
int Blank;
 
void backtracking(int depth, int idx);
bool is_ok(pair<intint> position);
 
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M;
    int blank = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> lab[i][j];
            if (lab[i][j] == 2)
                virus.push_back({ i,j });
            else if (!lab[i][j])
                Blank++;
        }
    }
    backtracking(00);
    if (ans == INF)
        cout << "-1\n";
    else cout << ans << "\n";
    return 0;
}
 
void backtracking(int depth, int idx) {
    if (depth == M) {
        //bfs ์‹œ์ž‘
        queue<pair<pair<intint>int>> q;
        for (int i = 0; i < active_virus.size(); i++)
            q.push({ active_virus[i], 0 });
        int Max_time = -1;
        int remain_blank = Blank;
        if (!remain_blank) {
            ans = 0;
            return;
        }
        memset(visited, 0sizeof(visited));
        while (!q.empty()) {
            pair<intint> now = q.front().first;
            int Time = q.front().second;
            q.pop();
            if (visited[now.first][now.second])
                continue;
            visited[now.first][now.second] = true;
            if (lab[now.first][now.second] == 0)
                remain_blank--;
            Max_time = max(Max_time, Time);
            if (!remain_blank) {
                ans = min(ans, Max_time);
                return;
            }
            for (int i = 0; i < 4; i++) {
                pair<intint> next = { now.first + dy[i], now.second + dx[i] };
                if (!is_ok(next))
                    continue;
                q.push({ next, Time + 1 });
            }
        }
        return;
    }
    else {
        for (int i = idx; i < virus.size(); i++) {
            active_virus.push_back(virus[i]);
            backtracking(depth + 1, i + 1);
            active_virus.pop_back();
        }
    }
}
 
bool is_ok(pair<intint> position) {
    if (position.first < 0 || position.first >= N || position.second < 0 || position.second >= N
        || visited[position.first][position.second] || lab[position.first][position.second] == 1)
        return false;
    return true;
}
cs

728x90

'๋ฐฑ์ค€ > Gold' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] 17822 : ์›ํŒ ๋Œ๋ฆฌ๊ธฐ  (0) 2022.05.18
[BOJ] 17779 : ๊ฒŒ๋ฆฌ๋งจ๋”๋ง 2  (0) 2022.05.18
[BOJ] 11758 : CCW  (0) 2022.05.12
[BOJ] 17143 : ๋‚š์‹œ์™•  (0) 2022.05.11
[BOJ] 17144 : ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!  (0) 2022.05.11