Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <cmath>
- #define pb push_back
- #define mp make_pair
- #define int long long
- #define f first
- using namespace std;
- int n, best = 1000;
- vector<int> ans;
- bool fin;
- int get_err(vector<int>& v) {
- int err = 0;
- for (int i = 0; i < n; ++i)
- for (int j = i+1; j < n; ++j) {
- if (abs(i-j) == abs(v[i]-v[j])) {
- ++err;
- }
- }
- return err;
- }
- void rec(vector<int> v, double t) {
- if (t < 0.00001 || fin) return;
- int err = get_err(v);
- if (!err) {
- fin = true;
- ans = v;
- return;
- }
- int i = rand()%n;
- int j = rand()%n;
- if (i == j) j = (i+1)%n;
- swap(v[i], v[j]);
- double rand_num = (rand()%1000)/1000;
- double conf = std::exp(double(best-err)/t);
- cout << conf << '\n';
- best = min(best, err);
- if (rand_num < conf) rec(v, t*0.98);
- }
- signed main() {
- cin >> n;
- while (!fin) {
- vector<int> v(n);
- for (int i = 0; i < n; ++i) v[i] = i;
- random_shuffle(v.begin(), v.end());
- rec(v, 400);
- }
- for (int i = 0; i < n; ++i) cout << ans[i]+1 << ' ';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement