Advertisement
haser__

Untitled

Jul 16th, 2021
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.37 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <bits/stdc++.h>
  3. #include <unordered_map>
  4. #include <unordered_set>
  5. #include <chrono>
  6. #include <cassert>
  7. #include <cstdlib>
  8. #include <ctime>
  9. #include <random>
  10. using namespace std;
  11. using namespace chrono;
  12. #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  13. #define int long long
  14. #define double long double
  15. #define sqr(x) (x)*(x)
  16. #define pb push_back
  17. typedef int C;
  18. typedef complex<C>P;
  19. #define X real()
  20. #define Y imag()
  21. #define ins insert
  22. #define amas(a) for (auto&c:a) cout<<c<<" ";
  23. #define pf push_front
  24. #define pii pair<int,int>
  25. #define pic pair<int,char>
  26. #define pci pair<char,int>
  27. int n, m, c;
  28. vector<vector<int>>check(4, vector<int>(11, 0));
  29. void gen(vector<vector<int>>&pole) {
  30.     for (int i = 1; i <= c; i++) {
  31.         for (int j = 0; j < n; j++) check[i][j] = 0;
  32.     }
  33.     for (int i = 0; i < n; i++) {
  34.         for (int j = 0; j < m; j++) {
  35.            // check[pole[i][j]][i] = 0;
  36.             pole[i][j] = rand() % c + 1;
  37.             check[pole[i][j]][i] += (1 << j);
  38.         }
  39.     }
  40. }
  41. int func(int col) {
  42.     int ans = 0;
  43.     for (int i = 0; i < n; i++) {
  44.         for (int j = i + 1; j < n; j++) {
  45.             int val = check[col][i] & check[col][j];
  46.             int cnt = 0;
  47.             for (int g = 0; g < m; g++) {
  48.                 if (val & (1 << g)) cnt++;
  49.             }
  50.             ans += (cnt * (cnt - 1)) / 2;
  51.         }
  52.     }
  53.     return ans;
  54. }
  55. bool f = false;
  56. void proc(vector<vector<int>>& pole) {
  57.     vector<int>col(4);
  58.     int sum =0;
  59.     for (int i = 1; i <= c; i++) {
  60.         col[i] = func(i);
  61.         sum += col[i];
  62.     }
  63.     if (sum == 0) {
  64.         f = true;
  65.        // cout << "SUK";
  66.     }
  67.     //cout << sum << "\n";
  68.     //return;
  69.     if (sum >10) return;
  70.     /*for (int i = 0; i < n; i++) {
  71.         for (int j = 0; j < m; j++) cout << pole[i][j] << " ";
  72.         cout << "\n";
  73.     }
  74.     cout << "\n";
  75.     cout << sum << "\n\n";*/
  76.     while (sum!=0) {
  77.         int ni = rand() % n;
  78.         int nj = rand() % m;
  79.         int lascol = pole[ni][nj];
  80.         int lascolval = col[lascol];
  81.         int newcol = rand() % c + 1;
  82.         if (col[lascol] == 0) continue;
  83.         while (newcol!=lascol) {
  84.          //   if (newcol != lascol && col[newcol] != 0) break;
  85.             newcol = rand() % c + 1;
  86.         }
  87.         check[lascol][ni] -= (1 << nj);
  88.         check[newcol][ni] += (1 << nj);
  89.         pole[ni][nj] = newcol;
  90.         col[lascol] = func(lascol);
  91.         col[newcol] = func(newcol);
  92.         int raz = col[lascol] + col[newcol] - lascolval;
  93.       /* for (int i = 0; i < n; i++) {
  94.             for (int j = 0; j < m; j++) cout << pole[i][j] << " ";
  95.             cout << "\n";
  96.         }
  97.         cout << "\n";
  98.         cout << sum+raz << "\n\n";*/
  99.         if (raz > 0) break;
  100.         sum += raz;
  101.         if (sum == 0) {
  102.             f = true;
  103.             return;
  104.         }
  105.     }
  106. }
  107. int32_t main() {
  108.     IOS;
  109.     srand(time(0));
  110.     cin >> n >> m >> c;
  111.     vector<vector<int>>pole(n, vector<int>(m,0));
  112.    /* for (int i = 0; i < n; i++) {
  113.         for (int j = 0; j < m; j++) {
  114.             cin >> pole[i][j];
  115.             check[pole[i][j]][i] += (1 << j);
  116.         }
  117.     }*/
  118.     while (!f) {
  119.         gen(pole);
  120.         proc(pole);
  121.     }
  122.     for (int i = 0; i < n; i++) {
  123.         for (int j = 0; j < m; j++) cout << pole[i][j] << " ";
  124.         cout << "\n";
  125.     }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement