[SWEA 5648] 원자 소멸 시뮬레이션
SW Expert Academy :: SWEA :: 5648 :: 원자 소멸 시뮬레이션
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct atom {
int n, i, j, d, e;
float c;
};
int N, ans;
vector <atom> v;
vector <pair<float, pair<int, int>>> ev;
inline void check(atom n1, atom n2) {
if (n1.d == 0) {
if (n2.d == 1 && n1.j == n2.j && n1.i<n2.i) {
ev.push_back(make_pair(abs((n1.i - n2.i) / 2.0), make_pair(n1.n, n2.n)));
}
else if (n2.d == 3 && n2.i>n1.i && n2.j<n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {
ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));
}
else if (n2.d == 2 && n2.i>n1.i && n2.j>n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {
ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));
}
}
else if (n1.d == 1) {
if (n2.d == 0 && n1.j == n2.j && n1.i > n2.i) {
ev.push_back(make_pair(abs((n1.i - n2.i) / 2.0), make_pair(n1.n, n2.n)));
}
else if (n2.d == 3 && n2.i<n1.i && n2.j<n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {
ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));
}
else if (n2.d == 2 && n2.i<n1.i && n2.j>n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {
ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));
}
}
else if (n1.d == 2) {
if (n2.d == 3 && n1.i == n2.i && n1.j > n2.j) {
ev.push_back(make_pair(abs((n1.j - n2.j) / 2.0), make_pair(n1.n, n2.n)));
}
else if (n2.d == 0 && n2.i<n1.i && n2.j<n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {
ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));
}
else if (n2.d == 1 && n2.i>n1.i && n2.j<n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {
ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));
}
}
else if (n1.d == 3) {
if (n2.d == 2 && n1.i == n2.i && n1.j < n2.j) {
ev.push_back(make_pair(abs((n1.j - n2.j) / 2.0), make_pair(n1.n, n2.n)));
}
else if (n2.d == 1 && n2.i>n1.i && n2.j>n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {
ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));
}
else if (n2.d == 0 && n2.i<n1.i && n2.j>n1.j && (abs(n1.i - n2.i) == abs(n1.j - n2.j))) {
ev.push_back(make_pair(abs(n1.i - n2.i), make_pair(n1.n, n2.n)));
}
}
}
void input() {
v.clear(); ev.clear();
cin >> N; ans = 0; atom a;
for (int i = 0; i < N; i++) {
cin >> a.j >> a.i >> a.d >> a.e; a.c = 0; a.n = i;
v.push_back(a);
}
}
int main() {
std::ios::sync_with_stdio(false); cin.tie(0);
int T; cin >> T;
for (int tc = 1; tc <= T; tc++) {
input();
for (int i = 0; i < N - 1; i++) for (int j = i + 1; j < N; j++)check(v[i], v[j]);
if (ev.size() > 0) {
sort(ev.begin(), ev.end());
float num;
for (int i = 0; i < ev.size(); i++) {
num = ev[i].first;
if (!(v[ev[i].second.first].c != 0 && v[ev[i].second.first].c != num)
&& !(v[ev[i].second.second].c != 0 && v[ev[i].second.second].c != num)) {
v[ev[i].second.first].c = num; v[ev[i].second.second].c = num;
}
}
for (int i = 0; i < N; i++) if (v[i].c) ans += v[i].e;
}
cout << "#" << tc << " " << ans << endl;
}
return 0;
}