Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define X first
- #define Y second
- const int N = 52, P = 526;
- const double EPS = 1e-7;
- pair<int, int> buffer[P];
- double bestAns = 1.0 / 0.0;
- char world[N + 1];
- mt19937 r(time(0));
- uniform_real_distribution<double> urd(0, 1);
- double getLen(pair<int, int> *points) {
- double ans = 0;
- for (int i = 1; i < P; ++i)
- ans += sqrt(pow(points[i].X - points[i - 1].X, 2) + pow(points[i].Y - points[i - 1].Y, 2));
- return ans;
- }
- bool better(double term, pair<int, int> *points) {
- double lans = getLen(points);
- if (lans < bestAns - EPS) {
- cout << "Relaxed from " << bestAns << " to " << lans << " (score: " << 10000 / (lans - 750) << ")" << endl;
- ofstream ofs("walk-output.txt");
- for (int i = 0; i < P; ++i) {
- if (points[i].Y > 25)
- ofs << char(points[i].Y - 26 + 'A');
- else
- ofs << char(points[i].Y + 'a');
- ofs << 52 - points[i].X << " ";
- }
- bestAns = lans;
- return true;
- } else {
- return urd(r) > exp(-(lans - bestAns) / term);
- }
- }
- int main() {
- int cnt = 0;
- for (int i = 0; i < N; ++i) {
- cin >> world;
- for (int j = 0; j < N; ++j)
- if (world[j] == '#')
- buffer[++cnt] = {i, j};
- }
- shuffle(buffer, buffer + P, r);
- uniform_int_distribution<> uid(0, N - 1);
- while (1) {
- for (double term = 100; term >= EPS; term -= 0.0001) {
- int lef = uid(r), rig = uid(r);
- if (lef > rig)
- swap(lef, rig);
- reverse(buffer + lef, buffer + rig + 1);
- if (!better(term, buffer))
- reverse(buffer + lef, buffer + rig + 1);
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment