Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // AocZz.cpp : This file contains the 'main' function. Program execution begins and ends there.
- //
- #include <stdio.h>
- #include <stdlib.h>
- struct Sensor
- {
- Sensor* prev{ 0 };
- int sx{ 0 };
- int sy{ 0 };
- int dist{ 0 };
- };
- bool isFound(Sensor* last, int x, int y)
- {
- if (x > 4000000)
- return false;
- if (y > 4000000)
- return false;
- if (x < 0)
- return false;
- if (y < 0)
- return false;
- for (Sensor* p = last; p; p = p->prev)
- {
- int len = abs(p->sx - x) + abs(p->sy - y);
- if (len <= p->dist)
- return false;
- }
- printf("%lld", 4000000ull * x + y);
- return true; // exit of recursion
- }
- bool readValue(FILE * f, int& val)
- {
- do
- {
- int c = fgetc(f);
- if (c < 0)
- return false;
- if ('=' == c)
- break;
- } while (true);
- val = 0;
- int sign = 1;
- do
- {
- int c = fgetc(f);
- if (c < 0)
- return false;
- if ('-' == c)
- {
- sign = -1;
- }
- else if (('9' >= c) && ('0' <= c))
- val = val * 10 + sign * (c - '0');
- else
- return val;
- } while (true);
- }
- void traverse(Sensor * last)
- {
- for (Sensor* p = last; p; p = p->prev)
- { // for each sensor, walk around it's perimeter and check points
- int len = p->dist + 1;
- int dirX[] = { -1, +1, -1, +1 };
- int dirY[] = { -1, -1, +1, +1 };
- for (int i = 0; i <= len; i++)
- {
- for (int k = 0; k < 4; k++)
- { // diamond with four sides
- if (isFound(last, p->sx + dirX[k] * (len - i), p->sy + dirY[k] * i))
- return;
- }
- }
- }
- }
- void recursiveReadValues(FILE* f, Sensor* pPrev)
- {
- Sensor s; // list of sensors gets stored in process stack
- s.prev = pPrev;
- int bx;
- int by;
- if (readValue(f, s.sx) && readValue(f, s.sy) && readValue(f, bx) && readValue(f, by))
- {
- s.dist = abs(bx - s.sx) + abs(by - s.sy);
- recursiveReadValues(f, &s);
- }
- else
- {
- fclose(f);
- traverse(pPrev); // exit of recursion
- }
- }
- int main()
- {
- FILE* f = NULL;
- fopen_s(&f, "input.txt", "r");
- recursiveReadValues(f, nullptr);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement