Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <bits/stdc++.h>
- #include <unordered_map>
- #include <unordered_set>
- #include <chrono>
- #include <cassert>
- #include <cstdlib>
- #include <ctime>
- #include <random>
- using namespace std;
- using namespace chrono;
- #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #define int long long
- #define double long double
- #define sqr(x) (x)*(x)
- #define pb push_back
- typedef int C;
- typedef complex<C>P;
- #define X real()
- #define Y imag()
- #define ins insert
- #define amas(a) for (auto&c:a) cout<<c<<" ";
- #define pf push_front
- #define pii pair<int,int>
- #define pic pair<int,char>
- #define pci pair<char,int>
- int n, m, c;
- vector<vector<int>>check(4, vector<int>(11, 0));
- void gen(vector<vector<int>>&pole) {
- for (int i = 1; i <= c; i++) {
- for (int j = 0; j < n; j++) check[i][j] = 0;
- }
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- // check[pole[i][j]][i] = 0;
- pole[i][j] = rand() % c + 1;
- check[pole[i][j]][i] += (1 << j);
- }
- }
- }
- int func(int col) {
- int ans = 0;
- for (int i = 0; i < n; i++) {
- for (int j = i + 1; j < n; j++) {
- int val = check[col][i] & check[col][j];
- int cnt = 0;
- for (int g = 0; g < m; g++) {
- if (val & (1 << g)) cnt++;
- }
- ans += (cnt * (cnt - 1)) / 2;
- }
- }
- return ans;
- }
- bool f = false;
- void proc(vector<vector<int>>& pole) {
- vector<int>col(4);
- int sum =0;
- for (int i = 1; i <= c; i++) {
- col[i] = func(i);
- sum += col[i];
- }
- if (sum == 0) {
- f = true;
- // cout << "SUK";
- }
- //cout << sum << "\n";
- //return;
- if (sum >10) return;
- /*for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) cout << pole[i][j] << " ";
- cout << "\n";
- }
- cout << "\n";
- cout << sum << "\n\n";*/
- while (sum!=0) {
- int ni = rand() % n;
- int nj = rand() % m;
- int lascol = pole[ni][nj];
- int lascolval = col[lascol];
- int newcol = rand() % c + 1;
- if (col[lascol] == 0) continue;
- while (newcol!=lascol) {
- // if (newcol != lascol && col[newcol] != 0) break;
- newcol = rand() % c + 1;
- }
- check[lascol][ni] -= (1 << nj);
- check[newcol][ni] += (1 << nj);
- pole[ni][nj] = newcol;
- col[lascol] = func(lascol);
- col[newcol] = func(newcol);
- int raz = col[lascol] + col[newcol] - lascolval;
- /* for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) cout << pole[i][j] << " ";
- cout << "\n";
- }
- cout << "\n";
- cout << sum+raz << "\n\n";*/
- if (raz > 0) break;
- sum += raz;
- if (sum == 0) {
- f = true;
- return;
- }
- }
- }
- int32_t main() {
- IOS;
- srand(time(0));
- cin >> n >> m >> c;
- vector<vector<int>>pole(n, vector<int>(m,0));
- /* for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- cin >> pole[i][j];
- check[pole[i][j]][i] += (1 << j);
- }
- }*/
- while (!f) {
- gen(pole);
- proc(pole);
- }
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) cout << pole[i][j] << " ";
- cout << "\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment