Advertisement
mayorBanana

Untitled

Nov 24th, 2024
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.58 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. #define FREE_FIELD 0
  7. #define UNBROKEN_FIELD_PART 1
  8. #define INJURED_FIELD_PART 2
  9. #define CHECKED_FIELD 3
  10. #define UNDEFINED_ORIENTATION_SHIP 0
  11. #define HORIZONTAL_SHIP 1
  12. #define VERTICAL_SHIP 2
  13. #define STATUS_UNBROKEN_SHIP 0
  14. #define STATUS_INJURED_SHIP 1
  15. #define STATUS_KILLED_SHIP 2
  16.  
  17.  
  18. typedef struct {
  19.     long int x, y;
  20.     int orintation;
  21.     long int len;
  22.     int status;
  23. } StatusShip;
  24.  
  25.  
  26. StatusShip GetStatus(long int width_field_, long int length_field_, int** array_, long int i_, long int j_) {
  27.     StatusShip StatusShip_;
  28.     StatusShip_.x = j_;
  29.     StatusShip_.y = i_;
  30.     StatusShip_.orintation = UNDEFINED_ORIENTATION_SHIP;
  31.     StatusShip_.len = 1;
  32.     if (array_[i_][j_] == UNBROKEN_FIELD_PART)
  33.         StatusShip_.status = STATUS_UNBROKEN_SHIP;
  34.     if (array_[i_][j_] == INJURED_FIELD_PART)
  35.         StatusShip_.status = STATUS_KILLED_SHIP;
  36.     if (j_ < length_field_) {
  37.         if (array_[i_][j_ + 1] == UNBROKEN_FIELD_PART || array_[i_][j_ + 1] == INJURED_FIELD_PART) {
  38.             if (j_ + 1 >= length_field_)
  39.                 printf("ALARM1\n");
  40.  
  41.             StatusShip_.orintation = HORIZONTAL_SHIP;
  42.             StatusShip_.len = 0;
  43.             int bomb_ = 0; // Переменная для определения статуса корабля
  44.             for (long int k = j_; k <= length_field_; k++) {
  45.                 if (array_[i_][k] == UNBROKEN_FIELD_PART || array_[i_][k] == INJURED_FIELD_PART) {
  46.                     bomb_ = bomb_ + array_[i_][k];
  47.                 }
  48.                 else break;
  49.                 StatusShip_.len++;
  50.             }
  51.             StatusShip_.status = STATUS_INJURED_SHIP; //статус "ранен"
  52.             if (bomb_ == StatusShip_.len)
  53.                 StatusShip_.status = STATUS_UNBROKEN_SHIP; //статус "целый"
  54.             if (bomb_ == StatusShip_.len * 2)
  55.                 StatusShip_.status = STATUS_KILLED_SHIP; //статус "убит"
  56.         }
  57.     }
  58.     if (i_ < width_field_) {
  59.         if (i_ + 1 >= width_field_)
  60.                 printf("ALARM2\n");
  61.  
  62.         if (array_[i_ + 1][j_] == UNBROKEN_FIELD_PART || array_[i_ + 1][j_] == INJURED_FIELD_PART) {
  63.             StatusShip_.orintation = VERTICAL_SHIP;
  64.             StatusShip_.len = 0;
  65.             int bomb_ = 0;
  66.             for (long int k = i_; k <= width_field_; k++) {
  67.                 if (array_[k][j_] == UNBROKEN_FIELD_PART || array_[k][j_] == INJURED_FIELD_PART) {
  68.                     bomb_ = bomb_ + array_[k][j_];
  69.                 }
  70.                 else break;
  71.                 StatusShip_.len++;
  72.             }
  73.             StatusShip_.status = STATUS_INJURED_SHIP;
  74.             if (bomb_ == StatusShip_.len)
  75.                 StatusShip_.status = STATUS_UNBROKEN_SHIP;
  76.             if (bomb_ == StatusShip_.len * 2)
  77.                 StatusShip_.status = STATUS_KILLED_SHIP;
  78.         }
  79.     }
  80.     return StatusShip_;
  81. }
  82. // Проверка, попадает ли коор-та в игровое поле:
  83. int CheckSea(long int width_field_, long int length_field_, long int i_, long int j_) {
  84.     if (i_ < 0 || j_ < 0 || i_ > width_field_ || j_ > length_field_)
  85.         return 0;
  86.     return 1;
  87. }
  88. int main() {
  89.     long int x, y;
  90.     StatusShip CurrentShip;
  91.     int Status_Ship[3] = { 0,0,0 };
  92.     int res;
  93.     if (scanf("%ld", &x) != 1) {
  94.         printf("bad input");
  95.         return 1;
  96.     }
  97.     if (scanf("%ld", &y) != 1) {
  98.         printf("bad input");
  99.         return 1;
  100.     }
  101.     if (((long long int)(x * y)) > pow(2, 31) - 1) {
  102.         printf("out of memory");
  103.         return 2;
  104.     }
  105.     if (x < 0 || y < 0) {
  106.         printf("bad input");
  107.         return 1;
  108.     }
  109.     int** array = (int**)malloc(sizeof(int*) * y);
  110.     if (array == NULL) {
  111.         printf("out of memory");
  112.         return 2;
  113.     }
  114.     for (long int i = 0; i < y; i++) {
  115.         array[i] = (int*)malloc(sizeof(int) * x);
  116.         if (array[i] == NULL) {
  117.             printf("out of memory");
  118.             for (long int i_ = 0; i_ < i - 1; i_++)
  119.                 free(array[i_]);
  120.             free(array);
  121.             return 2;
  122.         }
  123.     }
  124.     for (long int i = 0; i < y; i++) {
  125.         for (long int j = 0; j < x; j++) {
  126.             res = scanf("%d", &array[i][j]);
  127.             if (res == EOF || res == 0) {
  128.                 printf("bad input");
  129.                 for (long int i_ = 0; i_ < y; i_++)
  130.                     free(array[i_]);
  131.                 free(array);
  132.                 return 1;
  133.             }
  134.             if (!(array[i][j] == 0 || array[i][j] == 1 || array[i][j] == 2)) {
  135.                 printf("bad input");
  136.                 for (long int i_ = 0; i_ < y; i_++)
  137.                     free(array[i_]);
  138.                 free(array);
  139.                 return 1;
  140.             }
  141.         }
  142.     }
  143.     for (long int i = 0; i < y; i++) {
  144.         for (long int j = 0; j < x; j++) {
  145.             if (array[i][j] == FREE_FIELD || array[i][j] == CHECKED_FIELD)
  146.                 continue;
  147.             if (array[i][j] == UNBROKEN_FIELD_PART || array[i][j] == INJURED_FIELD_PART) {
  148.                 CurrentShip = GetStatus(y - 1, x - 1, array, i, j);
  149.                 if (CurrentShip.orintation == UNDEFINED_ORIENTATION_SHIP || CurrentShip.orintation == HORIZONTAL_SHIP) {
  150.                     for (long int k = CurrentShip.x - 1; k <= CurrentShip.x + CurrentShip.len; k++) {
  151.                         if (CheckSea(y - 1, x - 1, i - 1, k) == 1)
  152.                             array[i - 1][k] = CHECKED_FIELD;
  153.                         if (CheckSea(y - 1, x - 1, i, k) == 1)
  154.                             array[i][k] = CHECKED_FIELD;
  155.                         if (CheckSea(y - 1, x - 1, i + 1, k) == 1)
  156.                             array[i + 1][k] = CHECKED_FIELD;
  157.                     }
  158.                 }
  159.                 if (CurrentShip.orintation == VERTICAL_SHIP) {
  160.                     for (long int k = CurrentShip.y - 1; k <= CurrentShip.y + CurrentShip.len; k++) {
  161.                         if (CheckSea(y - 1, x - 1, k, j - 1) == 1)
  162.                             array[k][j - 1] = CHECKED_FIELD;
  163.                         if (CheckSea(y - 1, x - 1, k, j) == 1)
  164.                             array[k][j] = CHECKED_FIELD;
  165.                         if (CheckSea(y - 1, x - 1, k, j + 1) == 1)
  166.                             array[k][j + 1] = CHECKED_FIELD;
  167.                     }
  168.                 }
  169.                 Status_Ship[CurrentShip.status]++;
  170.             }
  171.         }
  172.     }
  173.     printf("%d %d %d", Status_Ship[0], Status_Ship[1], Status_Ship[2]);
  174.     for (long int i = 0; i < y; i++)
  175.         free(array[i]);
  176.     free(array);
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement