Guest User

Untitled

a guest
Apr 26th, 2024
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.14 KB | None | 0 0
  1. int cmp(const void *a, const void *b) {
  2.     return *(int *)a - *(int *)b;
  3. }
  4.  
  5. int* avoidFlood(int* rains, int rainsSize, int* returnSize) {
  6.     int *result = (int *)malloc(sizeof(int) * rainsSize);
  7.     int *nextRain = (int *)malloc(sizeof(int) * rainsSize);
  8.     int *fullLakes = (int *)malloc(sizeof(int) * rainsSize);
  9.     int fullLakesSize = 0, nextRainSize = 0;
  10.     memset(result, 0, sizeof(int) * rainsSize);
  11.     memset(nextRain, 0, sizeof(int) * rainsSize);
  12.     memset(fullLakes, 0, sizeof(int) * rainsSize);
  13.  
  14.     for (int i = 0; i < rainsSize; i++) {
  15.         if (rains[i] > 0) {
  16.             for (int j = 0; j < fullLakesSize; j++) {
  17.                 if (fullLakes[j] == rains[i]) {
  18.                     *returnSize = 0;
  19.                     return NULL;
  20.                 }
  21.             }
  22.             fullLakes[fullLakesSize++] = rains[i];
  23.             nextRain[nextRainSize++] = i;
  24.             result[i] = -1;
  25.         } else {
  26.             if (nextRainSize == 0) {
  27.                 result[i] = 1;
  28.             } else {
  29.                 qsort(nextRain, nextRainSize, sizeof(int), cmp);
  30.                 int lakeToDry = -1;
  31.                 for (int j = 0; j < nextRainSize; j++) {
  32.                     if (rains[nextRain[j]] > 0) {
  33.                         lakeToDry = rains[nextRain[j]];
  34.                         break;
  35.                     }
  36.                 }
  37.                 if (lakeToDry == -1) {
  38.                     result[i] = 1;
  39.                 } else {
  40.                     result[i] = lakeToDry;
  41.                     for (int j = 0; j < fullLakesSize; j++) {
  42.                         if (fullLakes[j] == lakeToDry) {
  43.                             fullLakes[j] = fullLakes[--fullLakesSize];
  44.                             break;
  45.                         }
  46.                     }
  47.                     for (int j = 0; j < nextRainSize; j++) {
  48.                         if (rains[nextRain[j]] == lakeToDry) {
  49.                             nextRain[j] = nextRain[--nextRainSize];
  50.                             break;
  51.                         }
  52.                     }
  53.                 }
  54.             }
  55.         }
  56.     }
  57.  
  58.     *returnSize = rainsSize;
  59.     return result;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment