Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 5;
- const int SQN = N * N;
- pair<int,int> row_sum[N + 1];
- pair<int,int> col_sum[N + 1];
- int result[N + 1][N + 1];
- int real_result[N + 1][N + 1];
- int prev_i = 1, prev_j = 0;
- bool mark[SQN + 1];
- bool horizontal = true;
- int sumn(int n) {
- return n * (n + 1) / 2;
- }
- int sumr(int n, int r) {
- return sumn(n) - sumn(n - r);
- }
- void print() {
- for (int i = 1; i <= N; i++) {
- for (int j = 1; j <= N; j++) {
- real_result[row_sum[i].second][col_sum[j].second] = result[i][j];
- }
- }
- for (int i = 1; i <= N; i++) {
- for (int j = 1; j <= N; j++) {
- printf("%d ", real_result[i][j]);
- }
- putchar('\n');
- }
- putchar('\n');
- }
- void brute(int i, int j);
- void dosth(int i, int j, int k) {
- if (k < 1 || k > SQN || mark[k]) return;
- if (
- row_sum[i].first >= k + sumn(N - j) &&
- col_sum[j].first >= k + sumn(N - i) &&
- row_sum[i].first <= k + sumr(SQN, N - j) &&
- col_sum[j].first <= k + sumr(SQN, N - i)
- ) {
- result[i][j] = k;
- row_sum[i].first -= k;
- col_sum[j].first -= k;
- mark[k] = true;
- if (i == N && j == N) {
- print();
- exit(0);
- }
- else if (j == N) {
- prev_j++;
- horizontal = false;
- brute(i + 1, prev_j);
- horizontal = true;
- prev_j--;
- }
- else if (i == N) {
- prev_i++;
- horizontal = true;
- brute(prev_i, j + 1);
- horizontal = false;
- prev_i--;
- }
- else if (horizontal) {
- brute(i, j + 1);
- }
- else {
- brute(i + 1, j);
- }
- row_sum[i].first += k;
- col_sum[j].first += k;
- mark[k] = false;
- }
- }
- void brute(int i, int j) {
- if (j == N) {
- dosth(i, j, row_sum[i].first);
- }
- else if (i == N) {
- dosth(i, j, col_sum[j].first);
- }
- else {
- for (int k = 1; k <= SQN; k++) {
- dosth(i, j, k);
- }
- }
- }
- int main() {
- cin.tie(0)->sync_with_stdio(0);
- for (int i = 1; i <= N; i++) {
- scanf("%d", &row_sum[i].first);
- row_sum[i].second = i;
- }
- for (int i = 1; i <= N; i++) {
- scanf("%d", &col_sum[i].first);
- col_sum[i].second = i;
- }
- sort(row_sum + 1, row_sum + N + 1);
- sort(col_sum + 1, col_sum + N + 1);
- brute(1, 1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement