aboutsummaryrefslogtreecommitdiff
path: root/src/2016/day22/aoc.cpp
blob: 0a48c4e06af94923714ce3d32a0fff4135a0ab49 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "aoc.h"
#include <algorithm>

namespace aoc2016 {

// A, B
bool is_pair(const grid_node& n1, const grid_node& n2) { return n1.s[1] > 0 && n2.s[2] >= n1.s[1]; }

void find_pairs(size_t x, const std::vector<grid_node>& ns, int* count) {
  if (x < ns.size() - 1) {
    auto& n1 = ns[x];
    for (size_t i = x + 1; i < ns.size(); i++) {
      auto& n2 = ns[i];
      if (is_pair(n1, n2)) {
        *count += 1;
      }
      if (is_pair(n2, n1)) {
        *count += 1;
      }
    }
    find_pairs(x + 1, ns, count);
  }
}

std::pair<int64_t, int64_t> day22(line_view file) {
  std::vector<grid_node> ns;
  int maxx{INT32_MIN};
  int maxy{INT32_MIN};

  per_line(file, [&ns, &maxx, &maxy](line_view lv) {
    if (*lv.line == '/') {
      grid_node n{lv};
      maxx = std::max(maxx, n.x);
      maxy = std::max(maxy, n.y);
      ns.emplace_back(n);
    }
    return true;
  });

  storage_grid grid(maxx + 1, maxy + 1);
  grid.load(ns);
  grid.print();

  // std::sort(ns.begin(), ns.end());
  // for (auto& n : ns) {
  //   n.print();
  // }
  int count{0};
  find_pairs(0, ns, &count);
  return {count, 0};
}
} // namespace aoc2016