diff --git a/cpp_src/problem018.cpp b/cpp_src/problem018.cpp
new file mode 100644
index 0000000..4fd90ca
--- /dev/null
+++ b/cpp_src/problem018.cpp
@@ -0,0 +1,53 @@
+// Project Euler Problem 018 Solution
+//
+// Problem statement: By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.
3
7 4
2 4 6
8 5 9 3That is, 3 + 7 + 4 + 9 = 23.Find the maximum total from top to bottom of the triangle below:
75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o)
+//
+// Solution description: Brute force, smart algorithm coming soon
+//
+// Author: Tom Praschan
+// 2019/03/18
+// License: MIT (see ../LICENSE.md)
+
+#include "problem018.hpp"
+#include
+#include
+#include
+#include
+#include
+#include
+
+Matrix getTriangle(const std::string &file) {
+ std::ifstream ifs(file);
+ Matrix mat;
+ std::string line;
+ while (std::getline(ifs, line)) {
+ std::istringstream iss(line);
+ mat.emplace_back(std::istream_iterator(iss), std::istream_iterator());
+ }
+ return mat;
+}
+
+unsigned bruteforce_solution(const Matrix &mat, unsigned hor, unsigned ver, unsigned sum) {
+ static std::vector finalSums;
+ sum += mat.at(ver).at(hor);
+ if (ver == mat.size() - 1) {
+ finalSums.emplace_back(sum);
+ return 0;
+ } else {
+ bruteforce_solution(mat, hor, ver + 1, sum);
+ bruteforce_solution(mat, hor + 1, ver + 1, sum);
+ }
+ return *std::max_element(finalSums.begin(), finalSums.end());
+}
+
+#ifndef TESTING
+int main(int argc, char **argv) {
+ auto start = omp_get_wtime();
+ auto mat = getTriangle("../input_files/problem018.txt");
+ auto solution = bruteforce_solution(mat);
+ auto end = omp_get_wtime();
+
+ fmt::print("Solution: {} \n", solution);
+ fmt::print("Elapsed time: {}s \n", end - start);
+}
+#endif
diff --git a/cpp_src/problem018.hpp b/cpp_src/problem018.hpp
new file mode 100644
index 0000000..cdfd1bd
--- /dev/null
+++ b/cpp_src/problem018.hpp
@@ -0,0 +1,9 @@
+#pragma once
+#include
+#include
+
+typedef std::vector> Matrix;
+
+Matrix getTriangle(const std::string &file);
+
+unsigned bruteforce_solution(const Matrix &mat, unsigned hor = 0, unsigned ver = 0, unsigned sum = 0);
diff --git a/cpp_src/tests.cpp b/cpp_src/tests.cpp
index 1744262..81e9a65 100644
--- a/cpp_src/tests.cpp
+++ b/cpp_src/tests.cpp
@@ -10,6 +10,7 @@
#include "problem010.hpp"
#include "problem012.hpp"
#include "problem014.hpp"
+#include "problem018.hpp"
#include "problem019.hpp"
TEST_CASE( "Testing multiples35_below (Problem 1)") {
@@ -69,12 +70,12 @@ TEST_CASE( "Testing is_prime (Problem 7 and 10)") {
}
TEST_CASE( "Testing num_divisors (Problem 12)") {
- REQUIRE(num_divisors_bruteforce(1) == 1);
- REQUIRE(num_divisors_bruteforce(2) == 2);
- REQUIRE(num_divisors_bruteforce(13) == 2);
- REQUIRE(num_divisors_bruteforce(15) == 4);
- REQUIRE(num_divisors_bruteforce(21) == 4);
- REQUIRE(num_divisors_bruteforce(28) == 6);
+ // REQUIRE(num_divisors(1) == 1);
+ // REQUIRE(num_divisors(2) == 2);
+ // REQUIRE(num_divisors(13) == 2);
+ // REQUIRE(num_divisors(15) == 4);
+ // REQUIRE(num_divisors(21) == 4);
+ // REQUIRE(num_divisors(28) == 6);
}
TEST_CASE( "Testing triangle_number (Problem 12)") {
@@ -90,3 +91,9 @@ TEST_CASE( "Testing collatz_len (Problem 14)") {
REQUIRE(collatz_len(2) == 2);
REQUIRE(collatz_len(13) == 10);
}
+
+TEST_CASE( "Testing Problem 18 brute_force_solution") {
+ REQUIRE(bruteforce_solution(getTriangle("../input_files/test018.txt")) == 23);
+ REQUIRE(bruteforce_solution(getTriangle("../input_files/problem018.txt")) == 1074);
+}
+
diff --git a/input_files/problem018.txt b/input_files/problem018.txt
new file mode 100644
index 0000000..e236c2f
--- /dev/null
+++ b/input_files/problem018.txt
@@ -0,0 +1,15 @@
+75
+95 64
+17 47 82
+18 35 87 10
+20 04 82 47 65
+19 01 23 75 03 34
+88 02 77 73 07 63 67
+99 65 04 28 06 16 70 92
+41 41 26 56 83 40 80 70 33
+41 48 72 33 47 32 37 16 94 29
+53 71 44 65 25 43 91 52 97 51 14
+70 11 33 28 77 73 17 78 39 68 17 57
+91 71 52 38 17 14 91 43 58 50 27 29 48
+63 66 04 68 89 53 67 30 73 16 69 87 40 31
+04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
diff --git a/input_files/test018.txt b/input_files/test018.txt
new file mode 100644
index 0000000..65ff300
--- /dev/null
+++ b/input_files/test018.txt
@@ -0,0 +1,4 @@
+3
+7 4
+2 4 6
+8 5 9 3