[BOJ] 9874 : Wormholes
๋ฌธ์ ๋งํฌ
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<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 12 + 5;
vector<pair<int, int>> wormholes;
int N;
int ans;
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;
}
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;
}
}
}
}
}
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<int, int>> temp;
bool visited[MAX_N];
memset(visited, false, sizeof(visited));
backtracking(0, temp, visited);
cout << ans << "\n";
return 0;
}
|
cs |