Advertisement
sarumeister

AoC-2022 Day 15b -- no allocs + heavy steroids

Dec 15th, 2022 (edited)
893
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.35 KB | None | 0 0
  1. // AocZz.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. //
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. struct Sensor
  8. {
  9.     Sensor* prev{ 0 };
  10.     int sx{ 0 };
  11.     int sy{ 0 };
  12.     int dist{ 0 };
  13. };
  14.  
  15. bool isFound(Sensor* last, int x, int y)
  16. {
  17.     if (x > 4000000)
  18.         return false;
  19.     if (y > 4000000)
  20.         return false;
  21.     if (x < 0)
  22.         return false;
  23.     if (y < 0)
  24.         return false;
  25.  
  26.     for (Sensor* p = last; p; p = p->prev)
  27.     {
  28.         int len = abs(p->sx - x) + abs(p->sy - y);
  29.         if (len <= p->dist)
  30.             return false;
  31.     }
  32.  
  33.     printf("%lld", 4000000ull * x + y);
  34.     return true; // exit of recursion
  35. }
  36.  
  37.  
  38.  
  39. bool readValue(FILE * f, int& val)
  40. {
  41.     do
  42.     {
  43.         int c = fgetc(f);
  44.         if (c < 0)
  45.             return false;
  46.         if ('=' == c)
  47.             break;
  48.     } while (true);
  49.  
  50.     val = 0;
  51.     int sign = 1;
  52.     do
  53.     {
  54.         int c = fgetc(f);
  55.         if (c < 0)
  56.             return false;
  57.         if ('-' == c)
  58.         {
  59.             sign = -1;
  60.         }
  61.         else if (('9' >= c) && ('0' <= c))
  62.             val = val * 10 + sign * (c - '0');
  63.         else
  64.             return val;
  65.     } while (true);
  66. }
  67.  
  68. void traverse(Sensor * last)
  69. {
  70.     for (Sensor* p = last; p; p = p->prev)
  71.     {   // for each sensor, walk around it's perimeter and check points
  72.         int len = p->dist + 1;
  73.  
  74.         int dirX[] = { -1, +1, -1, +1 };
  75.         int dirY[] = { -1, -1, +1, +1 };
  76.  
  77.         for (int i = 0; i <= len; i++)
  78.         {
  79.             for (int k = 0; k < 4; k++)
  80.             {   // diamond with four sides
  81.                 if (isFound(last, p->sx + dirX[k] * (len - i), p->sy + dirY[k] * i))
  82.                     return;
  83.             }
  84.         }
  85.     }
  86. }
  87.  
  88. void recursiveReadValues(FILE* f, Sensor* pPrev)
  89. {
  90.     Sensor s; // list of sensors gets stored in process stack
  91.     s.prev = pPrev;
  92.     int bx;
  93.     int by;
  94.     if (readValue(f, s.sx) && readValue(f, s.sy) && readValue(f, bx) && readValue(f, by))
  95.     {
  96.         s.dist = abs(bx - s.sx) + abs(by - s.sy);
  97.         recursiveReadValues(f, &s);
  98.     }
  99.     else
  100.     {
  101.         fclose(f);
  102.         traverse(pPrev); // exit of recursion
  103.     }
  104. }
  105.  
  106. int main()
  107. {
  108.     FILE* f = NULL;
  109.     fopen_s(&f, "input.txt", "r");
  110.  
  111.     recursiveReadValues(f, nullptr);
  112.  
  113.     return 0;
  114. }
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement