#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); } } bool isInBounds(pair location, const vector &map) { return (location.first >= 0 && location.first < map.size()) && (location.second >= 0 && location.second < map[0].size()); } vector> getAntinodes(pair antenna1, pair antenna2, const vector &antennaMap) { if (antenna1 == antenna2) { return {}; } pair directionVector = {antenna2.first - antenna1.first, antenna2.second - antenna1.second}; pair antinode1 = {antenna2.first + directionVector.first, antenna2.second + directionVector.second}; pair antinode2 = {antenna1.first - directionVector.first, antenna1.second - directionVector.second}; vector> antinodes; if (isInBounds(antinode1, antennaMap)) { antinodes.push_back(antinode1); } if (isInBounds(antinode2, antennaMap)) { antinodes.push_back(antinode2); } return antinodes; } int main() { vector antennaMap; map>> antennas; readInput(antennaMap, antennas); set> uniqueAntinodes; for (auto antennasWithSameFrequency : antennas) { for (auto antenna1 : antennasWithSameFrequency.second) { for (auto antenna2 : antennasWithSameFrequency.second) { vector> foundAntinodes = getAntinodes(antenna1, antenna2, antennaMap); for (pair antinode : foundAntinodes) { uniqueAntinodes.insert(antinode); } } } } // Part one cout << "Number of unique antinodes: " << uniqueAntinodes.size() << endl; }