#include #include #include #include #include using namespace std; void readInput(vector &antennaMap, map>> &antennas) { string line; for (size_t row = 0; getline(cin, line); row++) { for (size_t col = 0; col < line.size(); col++) { char frequency = line[col]; if (frequency != '.') { if (antennas.count(frequency)) { antennas.at(frequency).insert({row, col}); } else { antennas.insert({frequency, {{row, col}}}); } } } antennaMap.push_back(line); } } pair getDirectionVector(const pair &antenna1, const pair &antenna2) { return {antenna2.first - antenna1.first, antenna2.second - antenna1.second}; } bool isInBounds(const pair &location, const vector &map) { return (location.first >= 0 && cmp_less(location.first, map.size())) && (location.second >= 0 && cmp_less(location.second, map[0].size())); } vector> getAntinodes(const pair &antenna1, const pair &antenna2, const vector &antennaMap) { if (antenna1 == antenna2) { return {}; } const pair directionVector = getDirectionVector(antenna1, antenna2); const pair antinode1 = {antenna1.first - directionVector.first, antenna1.second - directionVector.second}; const pair antinode2 = {antenna2.first + directionVector.first, antenna2.second + directionVector.second}; vector> antinodes; if (isInBounds(antinode1, antennaMap)) { antinodes.push_back(antinode1); } if (isInBounds(antinode2, antennaMap)) { antinodes.push_back(antinode2); } return antinodes; } vector> getResonantHarmonicsAntinodes(const pair &antenna1, const pair &antenna2, const vector &antennaMap) { if (antenna1 == antenna2) { return {}; } const pair directionVector = getDirectionVector(antenna1, antenna2); vector> antinodes; pair antinode1 = antenna1; do { antinodes.push_back(antinode1); antinode1.first -= directionVector.first; antinode1.second -= directionVector.second; } while (isInBounds(antinode1, antennaMap)); pair antinode2 = antenna2; do { antinodes.push_back(antinode2); antinode2.first += directionVector.first; antinode2.second += directionVector.second; } while (isInBounds(antinode2, antennaMap)); return antinodes; } int main() { vector antennaMap; map>> antennas; readInput(antennaMap, antennas); set> uniqueAntinodes; set> uniqueResonantHarmonicsAntinodes; set, pair>> consideredAntennaCombinations; for (const auto &antennasWithSameFrequency : antennas) { for (const auto &antenna1 : antennasWithSameFrequency.second) { for (const auto &antenna2 : antennasWithSameFrequency.second) { const auto orderedPair = make_pair(min(antenna1, antenna2), max(antenna1, antenna2)); if (consideredAntennaCombinations.contains(orderedPair)) { continue; } consideredAntennaCombinations.insert(orderedPair); const vector> foundAntinodes = getAntinodes(antenna1, antenna2, antennaMap); for (pair antinode : foundAntinodes) { uniqueAntinodes.insert(antinode); } const vector> foundResonantHarmonicsAntinodes = getResonantHarmonicsAntinodes(antenna1, antenna2, antennaMap); for (pair antinode : foundResonantHarmonicsAntinodes) { uniqueResonantHarmonicsAntinodes.insert(antinode); } } } } // Part one cout << "Number of unique antinodes: " << uniqueAntinodes.size() << endl; // Part two cout << "Number of unique antinodes when taking resonant harmonics into account: " << uniqueResonantHarmonicsAntinodes.size() << endl; }