diff --git a/C++/CMakeLists.txt b/C++/CMakeLists.txt index de75bdb2..7c76ad26 100644 --- a/C++/CMakeLists.txt +++ b/C++/CMakeLists.txt @@ -19,6 +19,15 @@ add_library(test_runner STATIC # Algorithms # ============================================================================ +# ------------------- +# Backtracking +# ------------------- + +# N-Queens +add_executable(n_queens + test/algorithm/backtracking/n_queens.cpp) +target_link_libraries(n_queens test_runner) + # ------------------- # Dynamic programming # ------------------- diff --git a/C++/README.md b/C++/README.md index 925ec084..8889b59e 100644 --- a/C++/README.md +++ b/C++/README.md @@ -11,8 +11,8 @@ Implementing well-known (and some rare) **algorithms and data structures in C++* ### Algorithms * Backtracking - * [N-Queens](include/algorithm/backtracking/n_queens.hpp) - + * [N-Queens](include/algorithms/backtracking/n_queens.hpp) :white_check_mark: + * Dynamic programming * [0-1 knapsack](include/algorithm/dynamic_programming/0_1_knapsack.hpp) :white_check_mark: * [Coin change](include/algorithm/dynamic_programming/coin_change.hpp) :white_check_mark: diff --git a/C++/test/algorithm/backtracking/n_queens.cpp b/C++/test/algorithm/backtracking/n_queens.cpp new file mode 100644 index 00000000..cb6a7f11 --- /dev/null +++ b/C++/test/algorithm/backtracking/n_queens.cpp @@ -0,0 +1,59 @@ +#include "third_party/catch.hpp" +#include "algorithm/backtracking/n_queens.hpp" + +TEST_CASE("Base cases", "[backtracking][n_queens]") { + // N = 0 (cannot place) + NQueensSolver b0(0); + REQUIRE(b0.can_place_queens() == false); + + // N = 1 (can place) + NQueensSolver b1(1); + REQUIRE(b1.can_place_queens() == true); + REQUIRE(b1.num_solutions() == 1); + Board b1_sln {{true}}; + REQUIRE(b1.get_solution() == b1_sln); + std::vector b1_slns {{{true}}}; + REQUIRE(b1.get_solutions() == b1_slns); +} + +TEST_CASE("Unplaceable cases", "[backtracking][n_queens]") { + // N = 2 + NQueensSolver b2(2); + REQUIRE(b2.can_place_queens() == false); + + // N = 3 + NQueensSolver b3(3); + REQUIRE(b3.can_place_queens() == false); +} + +TEST_CASE("Placeable cases", "[backtracking][n_queens]") { + // N = 4 + NQueensSolver b4(4); + REQUIRE(b4.can_place_queens() == true); + REQUIRE(b4.num_solutions() == 2); + Board b4_sln1 { + {false, true, false, false}, + {false, false, false, true}, + {true, false, false, false}, + {false, false, true, false} + }; + Board b4_sln2 { + {false, false, true, false}, + {true, false, false, false}, + {false, false, false, true}, + {false, true, false, false} + }; + using Catch::Matchers::VectorContains; + REQUIRE_THAT(b4.get_solutions(), VectorContains(b4_sln1)); + REQUIRE_THAT(b4.get_solutions(), VectorContains(b4_sln2)); + + // N = 9 + NQueensSolver b9(9); + REQUIRE(b9.can_place_queens() == true); + REQUIRE(b9.num_solutions() == 352); + + // N = 11 + NQueensSolver b11(11); + REQUIRE(b11.can_place_queens() == true); + REQUIRE(b11.num_solutions() == 2680); +}