Advertisement
tuki2501

VMMTFIVE.cpp

Sep 14th, 2022 (edited)
598
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.52 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 5;
  5. const int SQN = N * N;
  6.  
  7. pair<int,int> row_sum[N + 1];
  8. pair<int,int> col_sum[N + 1];
  9. int result[N + 1][N + 1];
  10. int real_result[N + 1][N + 1];
  11.  
  12. int prev_i = 1, prev_j = 0;
  13. bool mark[SQN + 1];
  14. bool horizontal = true;
  15.  
  16. int sumn(int n) {
  17.     return n * (n + 1) / 2;
  18. }
  19.  
  20. int sumr(int n, int r) {
  21.     return sumn(n) - sumn(n - r);
  22. }
  23.  
  24. void print() {
  25.     for (int i = 1; i <= N; i++) {
  26.         for (int j = 1; j <= N; j++) {
  27.             real_result[row_sum[i].second][col_sum[j].second] = result[i][j];
  28.         }
  29.     }
  30.     for (int i = 1; i <= N; i++) {
  31.         for (int j = 1; j <= N; j++) {
  32.             printf("%d ", real_result[i][j]);
  33.         }
  34.         putchar('\n');
  35.     }
  36.     putchar('\n');
  37. }
  38.  
  39. void brute(int i, int j);
  40.  
  41. void dosth(int i, int j, int k) {
  42.     if (k < 1 || k > SQN || mark[k]) return;
  43.     if (
  44.       row_sum[i].first >= k + sumn(N - j) &&
  45.       col_sum[j].first >= k + sumn(N - i) &&
  46.       row_sum[i].first <= k + sumr(SQN, N - j) &&
  47.       col_sum[j].first <= k + sumr(SQN, N - i)
  48.       ) {
  49.         result[i][j] = k;
  50.         row_sum[i].first -= k;
  51.         col_sum[j].first -= k;
  52.         mark[k] = true;
  53.         if (i == N && j == N) {
  54.             print();
  55.             exit(0);
  56.         }
  57.         else if (j == N) {
  58.             prev_j++;
  59.             horizontal = false;
  60.             brute(i + 1, prev_j);
  61.             horizontal = true;
  62.             prev_j--;
  63.         }
  64.         else if (i == N) {
  65.             prev_i++;
  66.             horizontal = true;
  67.             brute(prev_i, j + 1);
  68.             horizontal = false;
  69.             prev_i--;
  70.         }
  71.         else if (horizontal) {
  72.             brute(i, j + 1);
  73.         }
  74.         else {
  75.             brute(i + 1, j);
  76.         }
  77.         row_sum[i].first += k;
  78.         col_sum[j].first += k;
  79.         mark[k] = false;
  80.     }
  81. }
  82.  
  83. void brute(int i, int j) {
  84.     if (j == N) {
  85.         dosth(i, j, row_sum[i].first);
  86.     }
  87.     else if (i == N) {
  88.         dosth(i, j, col_sum[j].first);
  89.     }
  90.     else {
  91.         for (int k = 1; k <= SQN; k++) {
  92.             dosth(i, j, k);
  93.         }
  94.     }
  95. }
  96.  
  97. int main() {
  98.     cin.tie(0)->sync_with_stdio(0);
  99.     for (int i = 1; i <= N; i++) {
  100.         scanf("%d", &row_sum[i].first);
  101.         row_sum[i].second = i;
  102.     }
  103.     for (int i = 1; i <= N; i++) {
  104.         scanf("%d", &col_sum[i].first);
  105.         col_sum[i].second = i;
  106.     }
  107.     sort(row_sum + 1, row_sum + N + 1);
  108.     sort(col_sum + 1, col_sum + N + 1);
  109.     brute(1, 1);
  110. }
  111.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement