Advertisement
Sc3ric

Untitled

Dec 4th, 2022
513
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.51 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 = malloc(sizeof(int*) * (n + 1));
  23.  
  24.     for (int i = 0; i < n; i++) {
  25.         fn[i] = 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;
  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 = malloc(sizeof(int*));
  71.             a[0] = malloc(sizeof(int));
  72.             a[0][0] = -1;
  73.             return a;
  74.         }
  75.     }
  76.  
  77.     return fn;
  78. }
  79.  
  80. void print_variants(int** field, int n, FILE* f) {
  81.     int max_size = 3 + 2 + 2 + 1;
  82.  
  83.     for (int i = 0; i < n; i++) {
  84.         for (int j = 0; j < n; j++) {
  85.             if (field[i][j]) {
  86.                 char* sa = malloc(sizeof(char) * max_size);
  87.                 snprintf(sa, max_size, "(%d,%d) ", i, j);
  88.                 fputs(sa, f);
  89.             }
  90.         }
  91.     }
  92. }
  93.  
  94. int main()
  95. {
  96.     int n, l, k, x, y;
  97.  
  98.     FILE* inp;
  99.     fopen_s(&inp, "input.txt", "r");
  100.  
  101.     if (inp == NULL) {
  102.         exit(1);
  103.     }
  104.  
  105.     char* line = malloc(sizeof(char) * 100);
  106.     fgets(line, 100, inp);
  107.     sscanf_s(line, "%d %d %d", &n, &l, &k);
  108.     //printf("%d %d %d\n", n, l, k);
  109.  
  110.     int** field = malloc(sizeof(int*) * (n + 1));
  111.     for (int i = 0; i < n; i++) {
  112.         field[i] = malloc(sizeof(int) * n);
  113.         for (int j = 0; j < n; j++) {
  114.             field[i][j] = 0;
  115.         }
  116.     }
  117.  
  118.     for (int i = 0; i < k; i++) {
  119.         while (fgets(line, 100, inp) != NULL) {
  120.             sscanf_s(line, "%d %d", &x, &y);
  121.             //printf("%d %d\n", x, y);
  122.             field[x][y] = 1;
  123.         }
  124.     }
  125.    
  126.     fclose(inp);
  127.  
  128.     FILE* out;
  129.     fopen_s(&out, "output.txt", "w");
  130.  
  131.     int one_e = 0;
  132.     int** bad_variants = copy_field(field, n);
  133.     while (1) {
  134.         int** variants = find_variants(field, bad_variants, n, l);
  135.  
  136.         if (variants[0][0] == -1) {
  137.             if (!one_e) {
  138.                 fputs("no solution", out);
  139.                 exit(0);
  140.             }
  141.             break;
  142.         }
  143.  
  144.         one_e = 1;
  145.         bad_variants = concat_fields(bad_variants, variants, n);
  146.         print_variants(variants, n, out);
  147.         fputs("\n", out);
  148.     }
  149.  
  150.     fclose(out);
  151.  
  152.     return 0;
  153. }
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement