알고리즘/SWEA

[SWEA 5648] 원자 소멸 시뮬레이션

히더 2018. 9. 20. 14:35

SW Expert Academy :: SWEA :: 5648 :: 원자 소멸 시뮬레이션


출처 : https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRFInKex8DFAUo&categoryId=AWXRFInKex8DFAUo&categoryType=CODE


#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;

}