Day12
This commit is contained in:
BIN
day12/elevation
Executable file
BIN
day12/elevation
Executable file
Binary file not shown.
225
day12/elevation.c
Normal file
225
day12/elevation.c
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define BUFFER_SIZE 256
|
||||||
|
#define FIFO_MAX 1000
|
||||||
|
#define PATH_MAX FIFO_MAX
|
||||||
|
#define CLIMB_THRESHOLD 1
|
||||||
|
|
||||||
|
int explore(int [*][*][2], int, int, int*, int, int, char[*][*], int, int);
|
||||||
|
|
||||||
|
struct fifoentry {
|
||||||
|
};
|
||||||
|
|
||||||
|
// Store in a fifo what to explore and where did it come from
|
||||||
|
unsigned fifo[FIFO_MAX][4], fifo_tail = 0;
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
char c;
|
||||||
|
int map_width = -1, col = 0, row = 0;
|
||||||
|
|
||||||
|
// It would be very impractical to dynamically try to allocate memory because
|
||||||
|
// we would have to collect the first row into a separate buffer and then copy it
|
||||||
|
// to our dynamically allocated array after reading the first row
|
||||||
|
char map[BUFFER_SIZE][BUFFER_SIZE];
|
||||||
|
int startPos[2], endPos[2];
|
||||||
|
|
||||||
|
while ((c = getchar()) != EOF) {
|
||||||
|
if (c == '\n') {
|
||||||
|
if (map_width == -1) map_width = col;
|
||||||
|
row++;
|
||||||
|
} else {
|
||||||
|
if (c == 'S') {
|
||||||
|
startPos[0] = col;
|
||||||
|
startPos[1] = row;
|
||||||
|
map[col][row] = 'a';
|
||||||
|
} else if (c == 'E') {
|
||||||
|
endPos[0] = col;
|
||||||
|
endPos[1] = row;
|
||||||
|
map[col][row] = 'z';
|
||||||
|
} else {
|
||||||
|
map[col][row] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (col == map_width) {
|
||||||
|
col = 0;
|
||||||
|
} else {
|
||||||
|
col++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Cols: %i, Rows: %i, Start: %i:%i, End: %i:%i\n", map_width, row, startPos[0], startPos[1], endPos[0], endPos[1]);
|
||||||
|
int visited[BUFFER_SIZE][BUFFER_SIZE][2];
|
||||||
|
|
||||||
|
for (int i = 0; i < row; i++) {
|
||||||
|
for (int j = 0; j < map_width; j++) {
|
||||||
|
visited[j][i][0] = -1;
|
||||||
|
visited[j][i][1] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let's climb
|
||||||
|
// We will have a FIFO, we pop the next move, and push all new paths to the end
|
||||||
|
// This way we will find the shortest path
|
||||||
|
int path_found = 0;
|
||||||
|
fifo[fifo_tail][0] = startPos[0];
|
||||||
|
fifo[fifo_tail][1] = startPos[1];
|
||||||
|
fifo[fifo_tail][2] = -2;
|
||||||
|
fifo[fifo_tail][3] = -2;
|
||||||
|
fifo_tail++;
|
||||||
|
|
||||||
|
while (!path_found) {
|
||||||
|
// Pop from the queue
|
||||||
|
int cCol = fifo[0][0];
|
||||||
|
int cRow = fifo[0][1];
|
||||||
|
int cFromCol = fifo[0][2];
|
||||||
|
int cFromRow = fifo[0][3];
|
||||||
|
|
||||||
|
for (int i = 0; i < fifo_tail - 1; i++) {
|
||||||
|
fifo[i][0] = fifo[i+1][0];
|
||||||
|
fifo[i][1] = fifo[i+1][1];
|
||||||
|
fifo[i][2] = fifo[i+1][2];
|
||||||
|
fifo[i][3] = fifo[i+1][3];
|
||||||
|
}
|
||||||
|
|
||||||
|
fifo_tail--;
|
||||||
|
|
||||||
|
// Explore the head
|
||||||
|
if (explore(visited, cCol, cRow, endPos, map_width, row, map, cFromCol, cFromRow)) {
|
||||||
|
path_found = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we have to backtrack
|
||||||
|
int numSteps = 0, last[2] = {visited[endPos[0]][endPos[1]][0], visited[endPos[0]][endPos[1]][1]};
|
||||||
|
while (last[0] != -2) {
|
||||||
|
int tmp[2] = {last[0], last[1]};
|
||||||
|
last[0] = visited[tmp[0]][tmp[1]][0];
|
||||||
|
last[1] = visited[tmp[0]][tmp[1]][1];
|
||||||
|
numSteps++;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Steps from START: %i\n", numSteps);
|
||||||
|
|
||||||
|
// It will be at max numSteps
|
||||||
|
int minSteps = numSteps;
|
||||||
|
// Do this again with every 'a' point for part 2
|
||||||
|
// I just copy the code in a for loop, I ain't refactoring this
|
||||||
|
for (int i = 0; i < row; i++) {
|
||||||
|
for (int j = 0; j < map_width; j++) {
|
||||||
|
if (map[j][i] != 'a') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
startPos[0] = j;
|
||||||
|
startPos[1] = i;
|
||||||
|
|
||||||
|
// Reset visited
|
||||||
|
for (int i = 0; i < row; i++) {
|
||||||
|
for (int j = 0; j < map_width; j++) {
|
||||||
|
visited[j][i][0] = -1;
|
||||||
|
visited[j][i][1] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset FIFO
|
||||||
|
path_found = 0, fifo_tail = 0;
|
||||||
|
fifo[fifo_tail][0] = startPos[0];
|
||||||
|
fifo[fifo_tail][1] = startPos[1];
|
||||||
|
fifo[fifo_tail][2] = -2;
|
||||||
|
fifo[fifo_tail][3] = -2;
|
||||||
|
fifo_tail++;
|
||||||
|
|
||||||
|
while (!path_found) {
|
||||||
|
// Pop from the queue
|
||||||
|
int cCol = fifo[0][0];
|
||||||
|
int cRow = fifo[0][1];
|
||||||
|
int cFromCol = fifo[0][2];
|
||||||
|
int cFromRow = fifo[0][3];
|
||||||
|
|
||||||
|
for (int i = 0; i < fifo_tail - 1; i++) {
|
||||||
|
fifo[i][0] = fifo[i+1][0];
|
||||||
|
fifo[i][1] = fifo[i+1][1];
|
||||||
|
fifo[i][2] = fifo[i+1][2];
|
||||||
|
fifo[i][3] = fifo[i+1][3];
|
||||||
|
}
|
||||||
|
|
||||||
|
fifo_tail--;
|
||||||
|
|
||||||
|
// Explore the head
|
||||||
|
if (explore(visited, cCol, cRow, endPos, map_width, row, map, cFromCol, cFromRow)) {
|
||||||
|
path_found = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We cannot traverse further, this is a dead end
|
||||||
|
if (fifo_tail == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// There might be cases when there isn't a path
|
||||||
|
if (path_found) {
|
||||||
|
numSteps = 0;
|
||||||
|
last[0] = visited[endPos[0]][endPos[1]][0];
|
||||||
|
last[1] = visited[endPos[0]][endPos[1]][1];
|
||||||
|
while (last[0] != -2) {
|
||||||
|
int tmp[2] = {last[0], last[1]};
|
||||||
|
last[0] = visited[tmp[0]][tmp[1]][0];
|
||||||
|
last[1] = visited[tmp[0]][tmp[1]][1];
|
||||||
|
numSteps++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numSteps < minSteps) {
|
||||||
|
minSteps = numSteps;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("Min Steps: %i\n", minSteps);
|
||||||
|
}
|
||||||
|
|
||||||
|
int explore(int visited[BUFFER_SIZE][BUFFER_SIZE][2], int col, int row, int* end, int mapWidth, int mapHeight, char map[BUFFER_SIZE][BUFFER_SIZE], int fromCol, int fromRow) {
|
||||||
|
if (visited[col][row][0] != -1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[col][row][0] = fromCol;
|
||||||
|
visited[col][row][1] = fromRow;
|
||||||
|
|
||||||
|
if (col == end[0] && row == end[1]) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (col < mapWidth - 1 && map[col + 1][row] <= map[col][row] + CLIMB_THRESHOLD) {
|
||||||
|
fifo[fifo_tail][0] = col + 1;
|
||||||
|
fifo[fifo_tail][1] = row;
|
||||||
|
fifo[fifo_tail][2] = col;
|
||||||
|
fifo[fifo_tail][3] = row;
|
||||||
|
fifo_tail++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (col > 0 && map[col - 1][row] <= map[col][row] + CLIMB_THRESHOLD) {
|
||||||
|
fifo[fifo_tail][0] = col - 1;
|
||||||
|
fifo[fifo_tail][1] = row;
|
||||||
|
fifo[fifo_tail][2] = col;
|
||||||
|
fifo[fifo_tail][3] = row;
|
||||||
|
fifo_tail++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (row < mapHeight - 1 && map[col][row + 1] <= map[col][row] + CLIMB_THRESHOLD) {
|
||||||
|
fifo[fifo_tail][0] = col;
|
||||||
|
fifo[fifo_tail][1] = row + 1;
|
||||||
|
fifo[fifo_tail][2] = col;
|
||||||
|
fifo[fifo_tail][3] = row;
|
||||||
|
fifo_tail++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (row > 0 && map[col][row - 1] <= map[col][row] + CLIMB_THRESHOLD) {
|
||||||
|
fifo[fifo_tail][0] = col;
|
||||||
|
fifo[fifo_tail][1] = row - 1;
|
||||||
|
fifo[fifo_tail][2] = col;
|
||||||
|
fifo[fifo_tail][3] = row;
|
||||||
|
fifo_tail++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
41
day12/input.txt
Normal file
41
day12/input.txt
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
abcccaaaaacccacccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaacaccccccaaacccccccccccccccccccccccccccccccccccaaaaaaaaccccccccccccccccccccccccccccccccaaaaaa
|
||||||
|
abcccaaaaacccaaacaaacccccccccccccccccaaccccccacccaacccccccccccaacccccaaaaaaaaaaaccaaaaaaccccccccccccccccccccccccccccccccccaaaaaccccccccccccccccccccccccccccccccccaaaaaa
|
||||||
|
abccccaaaaaccaaaaaaaccccccccccccccaaaacccccccaacaaacccccccccaaaaaacccaaaaaaaaaaaccaaaaaacccccccccccccccccccccccccccccccccccaaaaaccccccccccccccaaacccccccccccccccccaaaaa
|
||||||
|
abccccaacccccaaaaaacccccccccccccccaaaaaacccccaaaaaccccccccccaaaaaacaaaaaaaaaaaaaccaaaaaacccccccccccccccccccccccccccccccccccaacaaccccccccccccccaaaaccccccccccccccccccaaa
|
||||||
|
abccccccccccaaaaaaaacccccccccccaaccaaaaaccccccaaaaaacccccccccaaaaacaaaaaaaaccccccccaaaaacccccccccccccccccccccccccccccccccccaacccccccccccccccccaaaaccaaacccccccccccccaac
|
||||||
|
abaaaaaccccaaaaaaaaaaccccccaaccaacaaaaacccccaaaaaaaaaaacccccaaaaacaaaacaaaaacccccccaacaacccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaaaacccccccccccaaac
|
||||||
|
abaaaaaccccaaaaaaaaaacaacccaaaaaacaccaacccccaaaaaaaaaaacccccaaaaaccccccaaaaaccccccccccaacccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaakkkllccccccccccccccc
|
||||||
|
abaaaaacccccccaaacaaaaaaccccaaaaaaaccccccaaacccaacccaaaaaaacccccccccccccaaaaacccccccccaaaaaaccccccccccccccccccccccccccaaccccccccccccccccccccccackkkkkklllccccaaaccccccc
|
||||||
|
abaaaaacccccccaaacaaaaaaacccaaaaaaaccccccaaaacaaacaaaaaaaacccccccccccccaaaaaacccccccccaaaaaaccaacaacccccccccccccccaaaaaacccccccccccccccccccaaakkkkkkkkllllcccaaacaccccc
|
||||||
|
abaaaaaccccccccaacaaaaaaaacaaaaaaccccccccaaaaaaacaaaaaaaaacccccccccccccaaaacccccccccaaaaaaacccaaaaacccccccccccccccaaaaaaccccccccccccccccjjjjjkkkkkkpppplllcccaaaaaacccc
|
||||||
|
abaaaccccccccccccccaaaaaaacaaaaaacccccccccaaaaaaccaaaaaaaccccccccccccccccaaaccccccccaaaaaaaccccaaaaacccccccccccccccaaaaaaaccccaaccccccjjjjjjjkkkkppppppplllcccaaaaacccc
|
||||||
|
abccccccccccccccccaaaaaacccccccaaccccccaaaaaaaacccccaaaaaaccccccccccccccccccccccccccccaaaaaaccaaaaaacccccccccccccccaaaaaaaaaacaacccccjjjjjjjjjkooppppppplllcccaaacccccc
|
||||||
|
abccccccccccccccccaaaaaacccccccccccccccaaaaaaaaacccaaacaaacccccccccccccccccccccccaaaccaaccaaccaaaaccccccccccccccccaaaaaaaccaaaaaccccjjjjooooooooopuuuupppllccccaaaccccc
|
||||||
|
abccccccccccccccccccccaaccccccccccccccccaaaaaaaacccaaaccaacccccccccccccccccccccccaaaaaaacccccccaaaccccccccccccccccaaaaaaccccaaaaaaccjjjoooooooooouuuuuupplllccccaaccccc
|
||||||
|
abccaaaaccccaaacccccccccccccccccccccccccccaaaaaaaccaaccccccccccccaacccccccccccccccaaaaacccaaccaaaccccccccccccccccccccaaacccaaaaaaaccjjjoootuuuuuuuuuuuuppllllccccaccccc
|
||||||
|
abccaaaaaccaaaacccccccccccccccccccccccccccaacccacccccccccccccccacaaaacccccccccccaaaaaaacccaaaaaaacccccccccccccccccccccccccaaaaaacccciijnoottuuuuuuxxyuvpqqlmmcccccccccc
|
||||||
|
abcaaaaaaccaaaacccccccaaaaccccccccccacccccaaccccaaaccccccccccccaaaaaacccccccccccaaaaaaaaccaaaaaacccccccccccccccccaacccccccaacaaacccciiinntttxxxxuxxyyvvqqqqmmmmddddcccc
|
||||||
|
abcaaaaaacccaaacccccccaaaaccccaaaaaaaaccaaaaccccaacaacccccccccccaaaaccccccccccccaaaaaaaacccaaaaaaaacccccccccccccaaaaccccccccccaacccciiinntttxxxxxxxyyvvqqqqqmmmmdddcccc
|
||||||
|
abcaaaaaacccccccccccccaaaacccccaaaaaacccaaaaaaaaaaaaacccccccccccaaaaccccccccccccccaaacacccaaaaaaaaacccccccccccccaaaacccccccccccccccciiinnnttxxxxxxxyyvvvvqqqqmmmdddcccc
|
||||||
|
abcccaaccccccccccccccccaaccccccaaaaaacccaaaaaaaaaaaaaaccccccccccaacaccccccccccccccaaaccccaaaaaaaaaacccccccccccccaaaacccccccccccccccciiinnntttxxxxxyyyyyvvvqqqqmmmdddccc
|
||||||
|
SbccccccccccccccccccccccccccccaaaaaaaaccaaaccaaaaaaaaacccccccccccccccccccccccccccccccccccaaaaaaacccccccccaacccccccccccccccccccccccccciiinntttxxxxEzyyyyyvvvqqqmmmdddccc
|
||||||
|
abcccccccccccccccccccccccccccaaaaaaaaaacccccccaaaaaacccccccccccccaaacccccaacaacccccccccccccccaaaaaaccccccaacaaacccccccccccccccccccccciiinntttxxxyyyyyyyvvvvqqqmmmdddccc
|
||||||
|
abcccccccccccccccccccccccccccaaaaaaaaaaccccccaaaaaaaaccccccccccccaaaccccccaaaacccccccccccccccaaaaaaccccccaaaaacccccccccccccccccccccciiinnnttxxyyyyyyyvvvvvqqqqmmmdddccc
|
||||||
|
abcccccccccccccccccccccccccccacacaaacccccccccaaaaaaacccccccccccaaaaaaaacccaaaaacccccccccccccccaaaaaaaacaaaaaaccccccccccccccccccccccciiinntttxxwyyyyywwvvrrrqqmmmdddcccc
|
||||||
|
abaccccccccccccccccccccccccccccccaaacccccccccaaacaaaaacccccccccaaaaaaaaccaaaaaacccccccccccccccaaaaaaaacaaaaaaacccccccccccccccccccccchhnnnttwwwwwwwyyywvrrrrnnnnmdddcccc
|
||||||
|
abaccccccccccccccccccccccccccccccaaccccccccccccccaaaaaacccccccccaaaaaccccaaaacaccccccccccccccccaaaaacccccaaaaaaccccccaaaccccccaaaccchhnmmttswwwwwwywwwrrrrnnnnneeeccccc
|
||||||
|
abaccccccccccccccccccccccccccccccccccccccccccccccaaaaaacccccaaccaaaaaacccccaaccccccccccccccccccaaaaaaccccaaccaaccccaaaaaacccccaaacahhhmmmsssssssswwwwwrrrnnnneeeecccccc
|
||||||
|
abaaaccccccccccccccccccccccccccccaaaccccccccccccccaaaaaccccaaaccaaaaaacccccccccccccccccccccccccaaaaaaccccaaccccccccaaaaaacccaaaaaaahhhmmmmsssssssswwwwrrnnnneeeeacccccc
|
||||||
|
abaaaccccccccccccccccccccccccccccaaaaaaccccccccccaaaaacaaaaaaaccaaaccaccccccccaaaaaccccccccccccaaaacacccccccccccccccaaaaacccaaaaaaahhhhmmmmssssssswwwwrrnnneeeeaacccccc
|
||||||
|
abaaacccccccccccccccccccccccccccaaaaaaaccccccccccaaaaacaaaaaaaaaacccaaaaacccccaaaaacccccccccacaaaaaccacccccccccccccaaaaacccccaaaaaachhhmmmmmmmmmsssrrrrrnnneeeaaaaacccc
|
||||||
|
abaccccccccccccccaaaaccccccccccaaaaaaaacccccccccccccccccaaaaaaaaacccaaaaaccccaaaaaacccccccccaaaaaaaaaacccccccccccccaaaaaccccccaaaaachhhhmmmmmmmooossrrronneeeaaaaaacccc
|
||||||
|
abaccccccccccccccaaaaccccccccccaaaaaaacccccccccccccccccccaaaaaaaccccaaaaaacccaaaaaaccccaaaccaaaaaaaaaacccccccccccaaccccccccccaaaaaacchhhhhggggooooorrroonnfeeaaaaaccccc
|
||||||
|
abcccccccccccccccaaaaccccccccccccaaaaaacccccccccccccccccaaaaaaccccccaaaaaacccaaaaaaccccaaaaaacaaaaaacccccccccaaccaacccccccccccaacccccchhhhggggggoooooooooffeaaaaacccccc
|
||||||
|
abccccccccccccccccaacccccccccccccaaaaaacccccccaaccacccccaaaaaaacccccaaaaaaccccaaaccccccaaaaaacaaaaaacccccccccaaaaacccccccccccccccccccccccgggggggggooooooffffaaaaaaccccc
|
||||||
|
abccccccccccccccccccccccccccaaaccaacccccccccccaaaaacccccaaccaaacccccccaaacccccccccccccaaaaaaacaaaaaacccccccccaaaaaaaaccccccccccccccccccccccaaaggggfooooffffccccaacccccc
|
||||||
|
abaaccccccccccccccccccccccccaaacaccccccccccccaaaaacccccccccccaacccccccaaaacccaacccccccaaaaaaaaaaaaaaaccccccccccaaaaacccccccccccccaaaccccccccccccggfffffffffcccccccccccc
|
||||||
|
abaaccccccccccccccccccccccaacaaaaacccccccccccaaaaaacccccccccccccccccccaaaacaaaacccccccaaaaaaaaaccccaccccccccccaaaaaccccccccccccccaaaccccccccccccagfffffffccccccccccccca
|
||||||
|
abaacccccccaacccccccccccccaaaaaaaaccccccaacccccaaaacccccccccccccccccccaaaaaaaaacccccccccaaacaacaaacccccccccccaaacaaccccaaccaaccaaaaaaaaccccccccaaaccffffcccccccccccccaa
|
||||||
|
abaaaaaaaccaaccccccccccccccaaaaacccccccaaaacccaaccccccccccccccccccacaaaaaaaaaaccccccccccaaacaaaaaacccccccccccccccaaccccaaaaaaccaaaaaaaacccccccccaacccccccccccccccaaacaa
|
||||||
|
abaaaaaaaaaaccccccccccccccccaaaaaccccccaaaacccccccccccccccccccccccaaaaaaaaaaaaccccccccccccccaaaaaacccccccccccccccccccccaaaaaacccaaaaaacccccccccaaacccccccccccccccaaaaaa
|
||||||
|
abaaaacaaaaaaaacccccccccccccaacaaccccccaaaaccccccccccccccccccccccccaaaaaaaaaaacccccccccccccaaaaaaaacccccccccccccccccccaaaaaaaaccaaaaaaccccccccccccccccccccccccccccaaaaa
|
||||||
Reference in New Issue
Block a user