Pagini recente » Cod sursa (job #1399621) | Cod sursa (job #489977) | Cod sursa (job #2524378) | Cod sursa (job #299032) | Cod sursa (job #2976808)
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
inline int sqr(int a) { return a * a; }
void solve(vector<pair<int,int> > &v, pair<int, int> start, int startDist, vector<int> &res) {
vector<int> p;
for (int i = 0; i < v.size(); ++i) {
p.push_back(i);
}
int best = 2000000000;
do {
pair<int, int> pos = start;
int dist = startDist;
for (auto it : p) {
if (dist > res[p[p.size() - 1]]) {
break;
}
pair<int, int> next = v[it];
dist += sqr(pos.first - next.first) + sqr(pos.second - next.second);
pos = next;
}
//cout << pos.first << " " << pos.second << " " << dist << endl;
if (dist < res[p[p.size() - 1]]) {
res[p[p.size() - 1]] = dist;
}
} while (next_permutation(p.begin(), p.end()));
}
int main() {
freopen("bibel.in", "r", stdin);
freopen("bibel.out", "w", stdout);
int op;
vector<pair<int,int> > level;
vector<pair<int,int> > prevLevel;
vector<int> prevRes(1);
prevLevel.push_back(make_pair(0, 0));
while (true) {
cin >> op;
if (op == 2) {
return 0;
}
if (op == 1) {
vector<int> res(level.size(), 2000000000);
for (int i = 0; i < prevLevel.size(); ++i) {
solve(level, prevLevel[i], prevRes[i], res);
}
prevRes = res;
prevLevel = level;
level.clear();
int best = res[0];
for (auto it : res) {
best = min(best, it);
}
cout << best << "\n";
continue;
}
int x, y;
cin >> x >> y;
level.push_back(make_pair(x, y));
}
return 0;
}