Mlxa

save

Jun 14th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define X first
  5. #define Y second
  6.  
  7. const int N = 52, P = 526;
  8. const double EPS = 1e-7;
  9.  
  10. pair<int, int> buffer[P];
  11.  
  12. double bestAns = 1.0 / 0.0;
  13.  
  14. char world[N + 1];
  15.  
  16. mt19937 r(time(0));
  17. uniform_real_distribution<double> urd(0, 1);
  18.  
  19. double getLen(pair<int, int> *points) {
  20.     double ans = 0;
  21.     for (int i = 1; i < P; ++i)
  22.         ans += sqrt(pow(points[i].X - points[i - 1].X, 2) + pow(points[i].Y - points[i - 1].Y, 2));
  23.     return ans;
  24. }
  25.  
  26. bool better(double term, pair<int, int> *points) {
  27.     double lans = getLen(points);
  28.     if (lans < bestAns - EPS) {
  29.         cout << "Relaxed from " << bestAns << " to " << lans << " (score: " << 10000 / (lans - 750) << ")" << endl;
  30.         ofstream ofs("walk-output.txt");
  31.         for (int i = 0; i < P; ++i) {
  32.             if (points[i].Y > 25)
  33.                 ofs << char(points[i].Y - 26 + 'A');
  34.             else
  35.                 ofs << char(points[i].Y + 'a');
  36.             ofs << 52 - points[i].X << " ";
  37.         }
  38.         bestAns = lans;
  39.         return true;
  40.     } else {
  41.         return urd(r) > exp(-(lans - bestAns) / term);
  42.     }
  43. }
  44.  
  45. int main() {
  46.     int cnt = 0;
  47.     for (int i = 0; i < N; ++i) {
  48.         cin >> world;
  49.         for (int j = 0; j < N; ++j)
  50.             if (world[j] == '#')
  51.                 buffer[++cnt] = {i, j};
  52.     }
  53.     shuffle(buffer, buffer + P, r);
  54.     uniform_int_distribution<> uid(0, N - 1);
  55.     while (1) {
  56.         for (double term = 100; term >= EPS; term -= 0.0001) {
  57.             int lef = uid(r), rig = uid(r);
  58.             if (lef > rig)
  59.                 swap(lef, rig);
  60.             reverse(buffer + lef, buffer + rig + 1);
  61.             if (!better(term, buffer))
  62.                 reverse(buffer + lef, buffer + rig + 1);
  63.         }
  64.     }
  65.     return 0;
  66. }
Add Comment
Please, Sign In to add comment