#include "../include/useful_funcs.h" #include #include #include #include bool WillHeGetStuck(int posX, int posY, int direction, int locX, int locY, std::vector> map) { char op_x; char op_y; map[locX][locY] = '#'; int conter = 0; while (true) { map[posX][posY] = 'X'; conter++; if (conter > 10000) { return true; } switch (direction) { case 0: op_x = '-'; op_y = 'n'; break; case 1: op_x = 'n'; op_y = '+'; break; case 2: op_x = '+'; op_y = 'n'; break; case 3: op_x = 'n'; op_y = '-'; break; default: std::cerr << "How did we get here?" << std::endl; exit(255); break; } if (!AreWeInBounds(conditional_operation(posX, 1, op_x), conditional_operation(posY, 1, op_y), map)) { break; } switch (map[conditional_operation(posX, 1, op_x)] [conditional_operation(posY, 1, op_y)]) { case '#': direction++; if (direction > 3) { direction = 0; } break; default: posX = conditional_operation(posX, 1, op_x); posY = conditional_operation(posY, 1, op_y); } } return false; } int main() { std::ifstream inputfile("input"); std::string input; int res = 0; if (!inputfile.is_open()) { std::cerr << "Could not open the file" << std::endl; return ENOENT; } std::string line; std::vector> map; while (std::getline(inputfile, line)) { map.push_back(std::vector(line.begin(), line.end())); } int posX; int posY; int direction; /* 0: up 1: right 2: down 3: left */ for (int i = 0; i < map.size(); i++) { for (int j = 0; j < map[i].size(); j++) { if (map[i][j] == '^') { posX = i; posY = j; direction = 0; } } } for (int i = 0; i < map.size(); i++) { for (int j = 0; j < map[i].size(); j++) { if (map[i][j] == '^' || map[i][j] == '#') { continue; } else { if (WillHeGetStuck(posX, posY, direction, i, j, map)) { res++; } } } } std::cout << "\nRes: " << res << std::endl; }