Advertisement
scottish_esquire

Задача 2. Захват королевства.

Oct 8th, 2022
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <random>
  4. #include <functional>
  5.  
  6.  
  7. // Задача 2. Захват королевства.
  8.  
  9. // функция потерь
  10. int f(const std::vector<int>& figures, std::vector<std::vector<int>>& w, int p) {
  11.     int ans = 0;
  12.     std::vector<int> v(figures.size());
  13.  
  14.     for (auto i = 0; i < figures.size(); ++i) {
  15.         if (figures[i] == 1) {
  16.             v[i] = 1;
  17.             for (auto j = 0; j < figures.size(); ++j) {
  18.                 if (w[i][j] == p) {
  19.                     v[j] = 1;
  20.                 }
  21.             }
  22.         }
  23.     }
  24.     for (auto i = 0; i < v.size(); ++i) {
  25.         ans += v[i];
  26.     }
  27.  
  28.     return ans;
  29. }
  30.  
  31. int main() {
  32.     int n, k, type;
  33.     std::cin >> n >> k;
  34.     std::vector<std::vector<int>> w(n, std::vector<int> (n, 0));
  35.     int num_wis = 0;
  36.     for (auto i = 0; i < n; ++i) {
  37.         for (auto j = 0; j < n; ++j) {
  38.             std::cin >> type;
  39.             w[i][j] = type;
  40.         }
  41.     }
  42.  
  43.     // Изначальная расстановка
  44.     std::vector<int> figures(n);
  45.     for (auto i = 0; i < k; ++i) {
  46.         figures[i] = 1;
  47.     }
  48.  
  49.     std::random_device rd;
  50.     std::mt19937 rnd(1783461065);
  51.  
  52.  
  53.     std::shuffle(figures.begin(), figures.end(), rnd);
  54.     for (auto p = 1; p < 3; p++) {
  55.         int current = f(figures, w, p);
  56.      
  57.         double t = 1.0;
  58.        
  59.         for (size_t j = 0; j < 2000000 && current < n; ++j) {
  60.             t = t * 0.995;
  61.      
  62.             std::vector<int> u = figures;
  63.             std::swap(u[rnd() % n], u[rnd() % n]);
  64.             int next = f(u, w, p);
  65.             if (next > current || double(rnd()) / RAND_MAX < exp((next - current) / t)) {
  66.                 figures = u;
  67.                 current = next;
  68.             }
  69.         }
  70.         if (current != n) {
  71.             if (p == 2) {
  72.                 std::cout << 0 << std::endl;
  73.             }
  74.         } else {
  75.             std::cout << p << std::endl;
  76.             for (auto i = 0; i < figures.size(); i++) {
  77.                 num_wis += figures[i];
  78.             }
  79.             std::cout << num_wis << std::endl;
  80.             for (auto i = 0; i < figures.size(); i++) {
  81.                 if (figures[i] == 1) {
  82.                     std::cout << i + 1 << " ";
  83.                 }
  84.             }
  85.             break;
  86.         }
  87.     }
  88.  
  89.     return 0;
  90. }
  91.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement