Files
contests/advent_of_code/2022/9/main.cpp

83 lines
2.1 KiB
C++

#include <bits/stdc++.h>
using namespace std;
using Coords = pair<int, int>;
void moveTail(const Coords& head, Coords& tail){
if(abs(head.first - tail.first) <= 1 && abs(head.second - tail.second) <= 1){
return;
}
if(head.first == tail.first){
if(head.second > tail.second){
tail.second++;
} else{
tail.second--;
}
} else if(head.second == tail.second){
if(head.first > tail.first){
tail.first++;
} else{
tail.first--;
}
} else if(head.first > tail.first && head.second > tail.second){
tail.first++;
tail.second++;
} else if(head.first < tail.first && head.second > tail.second){
tail.first--;
tail.second++;
} else if(head.first > tail.first && head.second < tail.second){
tail.first++;
tail.second--;
} else if(head.first < tail.first && head.second < tail.second){
tail.first--;
tail.second--;
}
}
int main(){
ifstream input_file("input.txt");
string line;
Coords head(0, 0), tail(0, 0);
vector<Coords> body(8, {0,0});
set<Coords> visited_by_tail;
visited_by_tail.insert(tail);
while(getline(input_file, line)){
stringstream ss(line);
char direction;
int steps;
ss >> direction >> steps;
while(steps > 0){
if(direction == 'R'){
head.first++;
} else if(direction == 'L'){
head.first--;
} else if(direction == 'U'){
head.second++;
} else if(direction == 'D'){
head.second--;
}
moveTail(head, body[0]);
for(size_t i = 0; i < body.size() - 1; ++i){
moveTail(body[i], body[i+1]);
}
moveTail(body[7], tail);
visited_by_tail.insert(tail);
steps--;
// cout << head.first << " " << head.second << " " << tail.first << " " << tail.second << '\n';
}
}
cout << "Number of positions visited by the tail: " << visited_by_tail.size() << endl;
return 0;
}