solve day 10
This commit is contained in:
parent
0d53da5059
commit
10100da5e9
3 changed files with 199 additions and 0 deletions
8
10/example
Normal file
8
10/example
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
89010123
|
||||||
|
78121874
|
||||||
|
87430965
|
||||||
|
96549874
|
||||||
|
45678903
|
||||||
|
32019012
|
||||||
|
01329801
|
||||||
|
10456732
|
53
10/input
Normal file
53
10/input
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
65456780121098450187634569763232345103213014321223456
|
||||||
|
56565097632787543296323478890141234234102125630310767
|
||||||
|
67874198545601612345610165765650105145693496543407898
|
||||||
|
32923238723432709654326543034789076008786587854343210
|
||||||
|
41010129610549878723017832129878989019895674963210349
|
||||||
|
03498034534698965014898901038965432123107895674310478
|
||||||
|
12567012345787854198743230123453219654256456789321565
|
||||||
|
01698107659834723085650134562104508723340349876459874
|
||||||
|
98787238543225610176590121875698698812451210145960123
|
||||||
|
07456549850110765203485430984788767904322109236871234
|
||||||
|
12349654763234894312176534983109456765012218347120105
|
||||||
|
45898763120125234523054325672112309876544367898034876
|
||||||
|
36765812034576127654369010766043218987432458765565989
|
||||||
|
29876903107681038923478001897652345898901089014877856
|
||||||
|
10945789218996987610569123078901236754321198123966987
|
||||||
|
89032654309345678510787430121230109865120567001855496
|
||||||
|
70121023498210709425698945230381210778034056532743345
|
||||||
|
63210110567601812334321876545496321689765123443412210
|
||||||
|
54216787014503956745430965496587434509894329856301101
|
||||||
|
09105496923212345866787634987676543213456018763456932
|
||||||
|
18012387836781078975898523432345232122347890345367873
|
||||||
|
27601078745896769784309410541230143021038901276216784
|
||||||
|
34587669654305854693210305670321056523427987689105698
|
||||||
|
03490548741214903543211234781987897012310094576543567
|
||||||
|
12321239230903212650106521892016798987454123467612430
|
||||||
|
12332102107812121786787430752105678901960013438900421
|
||||||
|
01489237876543080695890124567234787017871012543321530
|
||||||
|
90574323965012891234301233208943296323702387654487651
|
||||||
|
87665010121026700343210120112350185410213498703599341
|
||||||
|
96556901212345619656903234013461234554396569812678210
|
||||||
|
03467832303434328743874105684570789689487876101432387
|
||||||
|
12346345694540345012565106799688778776536964566501498
|
||||||
|
01653210789691236522210239888799669890123453677890567
|
||||||
|
18764101988780987121329845677234550187652122989108906
|
||||||
|
89765001877101071030456776540112341290343001010267210
|
||||||
|
67896982769612132549105689432101032301234578981354310
|
||||||
|
78767853458743247678014988654312121000225665432458981
|
||||||
|
69656765432658958976529812763243029810116767898567652
|
||||||
|
30345899891067867789438701890156710723209852101438943
|
||||||
|
21230014780890986290105610981260823654367643067324321
|
||||||
|
10101423634761870121234327876501994569498543458015100
|
||||||
|
45672344543052765436543234566782987678534412109176211
|
||||||
|
34985495652143781287430110545093456767623303678989321
|
||||||
|
43856784743430690398710325432112129865414510510076450
|
||||||
|
32981012892121589459621234521001036772301623423165569
|
||||||
|
01670143345023498764560149693456345681066739654234678
|
||||||
|
12365294256510107643498238782347652397659848765985589
|
||||||
|
03454385107898212532567345601098701498943707678876432
|
||||||
|
12763476543789123431052101598709876510232110569845001
|
||||||
|
29854307630076034521043015691612389323101023454032132
|
||||||
|
38765218921165087654321126780543432134569878998108941
|
||||||
|
47894356712234198765230105621234567023878565089237650
|
||||||
|
21012349803343289890121234310123498012967432176546321
|
138
10/main.cc
Normal file
138
10/main.cc
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <vector>
|
||||||
|
#include <tuple>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
vector<vector<int>> parseGrid(const char *path) {
|
||||||
|
vector<vector<int>> grid;
|
||||||
|
|
||||||
|
ifstream input(path);
|
||||||
|
string line;
|
||||||
|
while (getline(input, line)) {
|
||||||
|
char c;
|
||||||
|
vector<int> row;
|
||||||
|
stringstream ss;
|
||||||
|
ss << line;
|
||||||
|
while (ss >> c) {
|
||||||
|
int num = c - '0';
|
||||||
|
row.push_back(num);
|
||||||
|
}
|
||||||
|
grid.push_back(row);
|
||||||
|
}
|
||||||
|
return grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
void printGrid(vector<vector<int>> grid) {
|
||||||
|
for (int y = 0; y < grid.size(); y++) {
|
||||||
|
for (int x = 0; x < grid[0].size(); x++) {
|
||||||
|
cout << grid[y][x];
|
||||||
|
}
|
||||||
|
cout << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int trailheadHelper(vector<vector<int>> grid, int y, int x, set<tuple<int,int>, greater<tuple<int,int>>> &visited) {
|
||||||
|
int curr = grid[y][x];
|
||||||
|
|
||||||
|
// base case
|
||||||
|
if (curr == 9) {
|
||||||
|
if (visited.count(make_tuple(y,x))) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
visited.insert(make_tuple(y,x));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int sum = 0;
|
||||||
|
|
||||||
|
// try each direction
|
||||||
|
if (x > 0 && grid[y][x - 1] == grid[y][x] + 1) {
|
||||||
|
sum += trailheadHelper(grid, y, x - 1, visited);
|
||||||
|
}
|
||||||
|
if (x < grid[y].size() - 1 && grid[y][x + 1] == grid[y][x] + 1) {
|
||||||
|
sum += trailheadHelper(grid, y, x + 1, visited);
|
||||||
|
}
|
||||||
|
if (y > 0 && grid[y - 1][x] == grid[y][x] + 1) {
|
||||||
|
sum += trailheadHelper(grid, y - 1, x, visited);
|
||||||
|
}
|
||||||
|
if (y < grid.size() - 1 && grid[y + 1][x] == grid[y][x] + 1) {
|
||||||
|
sum += trailheadHelper(grid, y + 1, x, visited);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
int trailheadCount(vector<vector<int>> grid, int y, int x) {
|
||||||
|
set<tuple<int,int>, greater<tuple<int,int>>> visited;
|
||||||
|
|
||||||
|
return trailheadHelper(grid, y, x, visited);
|
||||||
|
}
|
||||||
|
|
||||||
|
int trailheadCount2(vector<vector<int>> grid, int y, int x) {
|
||||||
|
int curr = grid[y][x];
|
||||||
|
|
||||||
|
// base case
|
||||||
|
if (curr == 9) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sum = 0;
|
||||||
|
|
||||||
|
// try each direction
|
||||||
|
if (x > 0 && grid[y][x - 1] == grid[y][x] + 1) {
|
||||||
|
sum += trailheadCount2(grid, y, x - 1);
|
||||||
|
}
|
||||||
|
if (x < grid[y].size() - 1 && grid[y][x + 1] == grid[y][x] + 1) {
|
||||||
|
sum += trailheadCount2(grid, y, x + 1);
|
||||||
|
}
|
||||||
|
if (y > 0 && grid[y - 1][x] == grid[y][x] + 1) {
|
||||||
|
sum += trailheadCount2(grid, y - 1, x);
|
||||||
|
}
|
||||||
|
if (y < grid.size() - 1 && grid[y + 1][x] == grid[y][x] + 1) {
|
||||||
|
sum += trailheadCount2(grid, y + 1, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int part1(const char *path) {
|
||||||
|
vector<vector<int>> grid = parseGrid(path);
|
||||||
|
|
||||||
|
int sum = 0;
|
||||||
|
for (int y = 0; y < grid.size(); y++) {
|
||||||
|
for (int x = 0; x < grid[0].size(); x++) {
|
||||||
|
if (grid[y][x] == 0) {
|
||||||
|
sum += trailheadCount(grid, y, x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
int part2(const char *path) {
|
||||||
|
vector<vector<int>> grid = parseGrid(path);
|
||||||
|
|
||||||
|
int sum = 0;
|
||||||
|
for (int y = 0; y < grid.size(); y++) {
|
||||||
|
for (int x = 0; x < grid[0].size(); x++) {
|
||||||
|
if (grid[y][x] == 0) {
|
||||||
|
sum += trailheadCount2(grid, y, x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
cout << "example1: " << part1("example") << endl;
|
||||||
|
cout << "input1: " << part1("input") << endl;
|
||||||
|
cout << "example2: " << part2("example") << endl;
|
||||||
|
cout << "input2: " << part2("input") << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue