๋ฐฑ์ค€/Gold

[BOJ] 9874 : Wormholes

Jaeguk 2022. 4. 22. 12:59
๋ฌธ์ œ ๋งํฌ

9874๋ฒˆ: Wormholes (acmicpc.net)

 

9874๋ฒˆ: Wormholes

Farmer John's hobby of conducting high-energy physics experiments on weekends has backfired, causing N wormholes (2 <= N <= 12, N even) to materialize on his farm, each located at a distinct point on the 2D map of his farm. According to his calculations, F

www.acmicpc.net

ํ‰๋ฉด์ƒ ๋ชจ๋“  ๊ตฌ๋ฉ๋“ค์˜ ํŽ˜์–ด๋ฅผ ์กฐํ•ฉํ•˜๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ.

๋ฌธ์ œ ํ•ด์„

์ผ๋‹จ ์˜์–ด๋กœ ๋œ ๋ฌธ์ œ๋ผ ๋ฌธ์ œ ํ•ด์„์ด ์–ด๋ ค์› ๋‹ค. ๊ฐ„๋ฝํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด Farmer John์˜ ๋†์žฅ์—๋Š” N๊ฐœ์˜ ๊ตฌ๋ฉ์ด ์žˆ๋‹ค. ์ด ๊ตฌ๋ฉ๋“ค์€ ๊ฐ๊ฐ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์œผ๋ฉฐ ์ด N/2๊ฐœ์˜ ์Œ์ด ์ƒ๊ธด๋‹ค. ๊ตฌ๋ฉ๋งˆ๋‹ค ์ผ๋Œ€์ผ ๋Œ€์‘์œผ๋กœ ์Œ์ด ์—ฐ๊ฒฐ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ตฌ๋ฉ A์™€ B๊ฐ€์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด A๋กœ ๋“ค์–ด๊ฐ€๋ฉด B๋กœ ๋‚˜์˜จ๋‹ค. ๋ฐ˜๋Œ€๋กœ B๋กœ ๋“ค์–ด๊ฐ€๋ฉด A๋กœ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. A์™€ B ์‚ฌ์ด ์ž„์˜์˜ ์ง€์ ์—์„œ ์ถœ๋ฐœํ•œ๋‹ค๋ฉด B๋กœ ๋“ค์–ด๊ฐ€์„œ A๋กœ ๋‚˜์˜ค๊ฒŒ ๋˜๊ณ  ๋‹ค์‹œ ๊ฐ€๋‹ค๋ณด๋ฉด ๋˜ B๋กœ ๋“ค์–ด๊ฐ€์„œ A๋กœ ๋‚˜์˜ค๋Š” ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋Œ๊ฒŒ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋•Œ Bessie๋Š” ํ•ญ์ƒ +X ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์›€์ง์ธ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฃจํ”„๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•˜๋Š” ๊ตฌ๋ฉ๋“ค์˜ ํŽ˜์–ด๋ฅผ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž.

ํ’€์ด

N์ด ์ตœ๋Œ€ 12์ด๋ฏ€๋กœ ๊ทธ๋ ‡๊ธฐ ํฌ์ง€์•Š๋‹ค. ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•ด์„œ ํŽ˜์–ด๋ฅผ ์ •ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ํƒ์ƒ‰ํ•ด์ค€๋‹ค. ์ด๋•Œ ํŽ˜์–ด์˜ ๊ฐœ์ˆ˜๋Š” ํ•ญ์ƒ N/2๊ฐœ ์ด๋ฏ€๋กœ ํŽ˜์–ด๊ฐ€ N/2๊ฐœ ๋งŒ๋“ค์–ด์กŒ์„ ๋•Œ ๋ฌดํ•œ๋ฃจํ”„๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•˜๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.

void backtracking(int idx, vector<pair<int, int>> pairs, bool visited[]) {
	if (pairs.size() == N / 2) {
		//๋ฃจํ”„ ์กด์žฌํ•˜๋Š”์ง€ ํƒ์ƒ‰
		for (int i = 0; i < N; i++) {
			if (is_loop(i, pairs)) {
				ans++;
				break;
			}
		}
		return;
	}
	for (int i = idx; i < N-1; i++) {
		if (visited[i] == false) {
			for (int j = i + 1; j < N; j++) {
				if (visited[j] == false) {
					visited[i] = true;
					visited[j] = true;
					pairs.push_back({ i,j });
					backtracking(i + 1, pairs, visited);
					pairs.pop_back();
					visited[i] = false;
					visited[j] = false;
				}
			}
		}
	}
}

 ์ด๋ฏธ ํŽ˜์–ด๊ฐ€ ์ •ํ•ด์ง„ ๊ตฌ๋ฉ์ธ์ง€ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ visited๋ผ๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

ํŽ˜์–ด์˜ ์ˆ˜๊ฐ€ N/2๊ฐœ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด ๋ชจ๋“  ๊ตฌ๋ฉ์„ ์ถœ๋ฐœ์ ์œผ๋กœ ์•„๋ž˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฃจํ”„๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํƒ์ƒ‰ํ•ด์ค€๋‹ค.

bool is_loop(int st, vector<pair<int,int>> pairs) {
	bool visited[MAX_N];
	memset(visited, false, sizeof(visited));
	int now = st;
	for (int i = 0; i < N; i++) {
		if (visited[now]) //์ด๋ฏธ ๋“ค์–ด๊ฐ”๋˜ ๊ตฌ๋ฉ์ด๋ฉด ๋ฃจํ”„๊ฐ€ ์กด์žฌ
			return true;
		visited[now] = true; //์•„๋‹ˆ๋ผ๋ฉด ๋ฐฉ๋ฌธ ์ฒดํฌ
		for (int j = 0; j < pairs.size(); j++) { //๋ฐ˜๋Œ€ํŽธ ๊ตฌ๋ฉ์„ ์ฐพ์•„์คŒ
			if (pairs[j].first == now) {
				now = pairs[j].second;
				break;
			}
			else if (pairs[j].second == now) {
				now = pairs[j].first;
				break;
			}
		}
		bool chk = false;
		for (int j = 0; j < wormholes.size(); j++) {
			if (wormholes[now].first < wormholes[j].first && wormholes[now].second == wormholes[j].second) {
				now = j;
				chk = true;
				break;
			}
		}
		if (!chk)
			return false;
	}
	return false;
}

Bessie๋Š” ํ•ญ์ƒ +X๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๋ฏ€๋กœ ํ˜„์žฌ ์œ„์น˜์˜ ์ขŒํ‘œ๋ณด๋‹ค๋ณด๋‹ค x ๊ฐ’์ด ํฌ๊ณ , y๊ฐ’์€ ๊ฐ™์€ ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

๋งŒ์•ฝ ๋ฃจํ”„๊ฐ€ ์กด์žฌํ•˜๋ฉด true ์•„๋‹ˆ๋ผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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
#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<intpair<intint>>vector<pair<intpair<intint>>>, greater<pair<intpair<intint>>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 12 + 5;
vector<pair<intint>> wormholes;
int N;
int ans;
 
bool is_loop(int st, vector<pair<int,int>> pairs) {
    bool visited[MAX_N];
    memset(visited, falsesizeof(visited));
    int now = st;
    for (int i = 0; i < N; i++) {
        if (visited[now]) //์ด๋ฏธ ๋“ค์–ด๊ฐ”๋˜ ๊ตฌ๋ฉ์ด๋ฉด ๋ฃจํ”„๊ฐ€ ์กด์žฌ
            return true;
        visited[now] = true//์•„๋‹ˆ๋ผ๋ฉด ๋ฐฉ๋ฌธ ์ฒดํฌ
        for (int j = 0; j < pairs.size(); j++) { //๋ฐ˜๋Œ€ํŽธ ๊ตฌ๋ฉ์„ ์ฐพ์•„์คŒ
            if (pairs[j].first == now) {
                now = pairs[j].second;
                break;
            }
            else if (pairs[j].second == now) {
                now = pairs[j].first;
                break;
            }
        }
        bool chk = false;
        for (int j = 0; j < wormholes.size(); j++) {
            if (wormholes[now].first < wormholes[j].first && wormholes[now].second == wormholes[j].second) {
                now = j;
                chk = true;
                break;
            }
        }
        if (!chk)
            return false;
    }
    return false;
}
 
void backtracking(int idx, vector<pair<intint>> pairs, bool visited[]) {
    if (pairs.size() == N / 2) {
        //๋ฃจํ”„ ์กด์žฌํ•˜๋Š”์ง€ ํƒ์ƒ‰
        for (int i = 0; i < N; i++) {
            if (is_loop(i, pairs)) {
                ans++;
                break;
            }
        }
        return;
    }
    for (int i = idx; i < N-1; i++) {
        if (visited[i] == false) {
            for (int j = i + 1; j < N; j++) {
                if (visited[j] == false) {
                    visited[i] = true;
                    visited[j] = true;
                    pairs.push_back({ i,j });
                    backtracking(i + 1, pairs, visited);
                    pairs.pop_back();
                    visited[i] = false;
                    visited[j] = false;
                }
            }
        }
    }
}
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N;
    for (int i = 0; i < N; i++) {
        int x, y;
        cin >> x >> y;
        wormholes.push_back({ x,y });
    }
    sort(wormholes.begin(), wormholes.end());
    vector<pair<intint>> temp;
    bool visited[MAX_N];
    memset(visited, falsesizeof(visited));
    backtracking(0, temp, visited);
    cout << ans << "\n";
    return 0;
}
cs

728x90