Advertisement
Sc3ric

lyuda-shahmaty

Dec 4th, 2022 (edited)
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.04 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int check_if_bad(int x1, int y1, int x2, int y2) {
  5.     return x1 == x2 || y1 == y2 || x1 + y1 == x2 + y2 || x1 - y1 == x2 - y2;
  6. }
  7.  
  8. int check_if_bad_f(int** field, int n, int x, int y) {
  9.     for (int i = 0; i < n; i++) {
  10.         for (int j = 0; j < n; j++) {
  11.             if (field[i][j]) {
  12.                 if (check_if_bad(i, j, x, y)) {
  13.                     return 1;
  14.                 }
  15.             }
  16.         }
  17.     }
  18.     return 0;
  19. }
  20.  
  21. int** copy_field(int** field, int n) {
  22.     int** fn = (int**)malloc(sizeof(int*) * (n + 1));
  23.  
  24.     for (int i = 0; i < n; i++) {
  25.         fn[i] = (int*)malloc(sizeof(int) * (n + 1));
  26.  
  27.         for (int j = 0; j < n; j++) {
  28.             fn[i][j] = field[i][j];
  29.         }
  30.     }
  31.  
  32.     return fn;
  33. }
  34.  
  35. int** concat_fields(int** f1, int** f2, int n) {
  36.     int** fn = copy_field(f1, n);
  37.  
  38.     for (int i = 0; i < n; i++) {
  39.         for (int j = 0; j < n; j++) {
  40.             if (f2[i][j]) {
  41.                 fn[i][j] = 1;
  42.             }
  43.         }
  44.     }
  45.  
  46.     return fn;
  47. }
  48.  
  49. int** find_variants(int** field, int** bad_variants, int n, int l) {
  50.     int** fn = copy_field(field, n);
  51.     int e = 0;
  52.  
  53.     for (int m = 0; m < l; m++) {
  54.         e = 0;
  55.         for (int i = 0; i < n; i++) {
  56.             for (int j = 0; j < n; j++) {
  57.                 if (!fn[i][j] && !bad_variants[i][j] && !check_if_bad_f(fn, n, i, j)) {
  58.                     fn[i][j] = 1;
  59.                     e = 1;
  60.                     break;
  61.                 }
  62.             }
  63.             if (e) {
  64.                 break;
  65.             }
  66.         }
  67.  
  68.         if (!e) {
  69.             //return blank if no solution
  70.             int** a = (int**)malloc(sizeof(int*));
  71.             a[0] = (int*)malloc(sizeof(int));
  72.             a[0][0] = -1;
  73.             return a;
  74.         }
  75.     }
  76.  
  77.     if (!e) {
  78.         //return blank if no solution
  79.         int** a = (int**)malloc(sizeof(int*));
  80.         a[0] = (int*)malloc(sizeof(int));
  81.         a[0][0] = -1;
  82.         return a;
  83.     }
  84.  
  85.     return fn;
  86. }
  87.  
  88. void print_variants(int** field, int n, FILE* f) {
  89.     int max_size = 1000;
  90.     int line_size = max_size * n * n;
  91.     char* line = (char*)malloc(sizeof(char) * line_size + 1);
  92.     line[0] = '\0';
  93.  
  94.     for (int i = 0; i < n; i++) {
  95.         for (int j = 0; j < n; j++) {
  96.             if (field[i][j]) {
  97.                 if (line[0] != '\0') {
  98.                     snprintf(line, line_size, "%s (%d,%d)", line, i, j);
  99.                 }
  100.                 else {
  101.                     snprintf(line, line_size, "(%d,%d)", i, j);
  102.                 }
  103.             }
  104.         }
  105.     }
  106.     fputs(line, f);
  107. }
  108.  
  109. int main()
  110. {
  111.     int n, l, k, x, y;
  112.  
  113.     FILE* inp = fopen("input.txt", "r");
  114.  
  115.     if (inp == NULL) {
  116.         exit(1);
  117.     }
  118.  
  119.     char* line = (char*)malloc(sizeof(char) * 100);
  120.     fgets(line, 100, inp);
  121.     sscanf(line, "%d %d %d", &n, &l, &k);
  122.     //printf("%d %d %d\n", n, l, k);
  123.  
  124.     int** field = (int**)malloc(sizeof(int*) * (n + 1));
  125.     for (int i = 0; i < n; i++) {
  126.         field[i] = (int*)malloc(sizeof(int) * n);
  127.         for (int j = 0; j < n; j++) {
  128.             field[i][j] = 0;
  129.         }
  130.     }
  131.  
  132.     for (int i = 0; i < k; i++) {
  133.         while (fgets(line, 100, inp) != NULL) {
  134.             sscanf(line, "%d %d", &x, &y);
  135.             //printf("%d %d\n", x, y);
  136.             field[x][y] = 1;
  137.         }
  138.     }
  139.    
  140.     fclose(inp);
  141.  
  142.     FILE* out = fopen("output.txt", "w");
  143.  
  144.     int one_e = 0;
  145.     int** bad_variants = copy_field(field, n);
  146.     while (1) {
  147.         int** variants = find_variants(field, bad_variants, n, l);
  148.  
  149.         if (variants[0][0] == -1) {
  150.             if (!one_e) {
  151.                 fputs("no solutions", out);
  152.                 exit(0);
  153.             }
  154.             break;
  155.         }
  156.  
  157.         if (one_e) {
  158.             fputs("\n", out);
  159.         }
  160.  
  161.         one_e = 1;
  162.         bad_variants = concat_fields(bad_variants, variants, n);
  163.         print_variants(variants, n, out);
  164.         if (l == 0) {
  165.             break;
  166.         }
  167.     }
  168.  
  169.     fclose(out);
  170.  
  171.     return 0;
  172. }
  173.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement