From ecd558bb70c8422ca0d1ce98c80e6ce2410d4a29 Mon Sep 17 00:00:00 2001 From: robin Date: Sat, 5 Oct 2019 12:25:04 +0530 Subject: [PATCH 1/3] add unit test for n-queens --- C++/CMakeLists.txt | 9 ++++ C++/test/algorithm/backtracking/n_queens.cpp | 49 ++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 C++/test/algorithm/backtracking/n_queens.cpp diff --git a/C++/CMakeLists.txt b/C++/CMakeLists.txt index 9d3704ce..c0b19138 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++/test/algorithm/backtracking/n_queens.cpp b/C++/test/algorithm/backtracking/n_queens.cpp new file mode 100644 index 00000000..42987e12 --- /dev/null +++ b/C++/test/algorithm/backtracking/n_queens.cpp @@ -0,0 +1,49 @@ +#include "third_party/catch.hpp" +#include "algorithm/backtracking/n_queens.hpp" + +TEST_CASE("Unplaceable cases", "[backtracking][n_queens]") { + NQueensSolver b0(0); + REQUIRE_FALSE(b0.can_place_queens()); + NQueensSolver b2(2); + REQUIRE_FALSE(b2.can_place_queens()); + NQueensSolver b3(3); + REQUIRE_FALSE(b3.can_place_queens()); +} + +TEST_CASE("Placeable cases", "[backtracking][n_queens]") { + NQueensSolver b1(1); + REQUIRE(b1.can_place_queens()); + 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); + + NQueensSolver b4(4); + REQUIRE(b4.can_place_queens()); + 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)); + + NQueensSolver b9(9); + REQUIRE(b9.can_place_queens()); + REQUIRE(b9.num_solutions() == 352); + + NQueensSolver b11(11); + REQUIRE(b11.can_place_queens()); + REQUIRE(b11.num_solutions() == 2680); + +} From a55c49036076b5d917b4e863f529d3b5a5398a57 Mon Sep 17 00:00:00 2001 From: Alex Johnson Date: Thu, 21 May 2020 11:00:23 -0700 Subject: [PATCH 2/3] Update readme with white check --- C++/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/C++/README.md b/C++/README.md index 531ef8d0..9a7ff4e8 100644 --- a/C++/README.md +++ b/C++/README.md @@ -11,7 +11,7 @@ Implementing well-known (and some rare) **algorithms and data structures in C++* ### Algorithms * Backtracking - * [N-Queens](include/algorithms/backtracking/n_queens.hpp) + * [N-Queens](include/algorithms/backtracking/n_queens.hpp) :white_check_mark: * Dynamic programming * [Longest decreasing subsequence](source/dynamic_programming/longest_decreasing_subsequence.hpp) :white_check_mark: * [Matrix chain multiplication](source/dynamic_programming/matrix_chain_mult.cpp) :white_check_mark: From 4102a81762cf21a64a7d086f81b20792f1a88cba Mon Sep 17 00:00:00 2001 From: Alex Johnson Date: Thu, 21 May 2020 11:13:49 -0700 Subject: [PATCH 3/3] Reorganize testing categories --- C++/test/algorithm/backtracking/n_queens.cpp | 36 +++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/C++/test/algorithm/backtracking/n_queens.cpp b/C++/test/algorithm/backtracking/n_queens.cpp index 42987e12..cb6a7f11 100644 --- a/C++/test/algorithm/backtracking/n_queens.cpp +++ b/C++/test/algorithm/backtracking/n_queens.cpp @@ -1,26 +1,35 @@ #include "third_party/catch.hpp" #include "algorithm/backtracking/n_queens.hpp" -TEST_CASE("Unplaceable cases", "[backtracking][n_queens]") { +TEST_CASE("Base cases", "[backtracking][n_queens]") { + // N = 0 (cannot place) NQueensSolver b0(0); - REQUIRE_FALSE(b0.can_place_queens()); - NQueensSolver b2(2); - REQUIRE_FALSE(b2.can_place_queens()); - NQueensSolver b3(3); - REQUIRE_FALSE(b3.can_place_queens()); -} + REQUIRE(b0.can_place_queens() == false); -TEST_CASE("Placeable cases", "[backtracking][n_queens]") { + // N = 1 (can place) NQueensSolver b1(1); - REQUIRE(b1.can_place_queens()); + 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()); + REQUIRE(b4.can_place_queens() == true); REQUIRE(b4.num_solutions() == 2); Board b4_sln1 { {false, true, false, false}, @@ -38,12 +47,13 @@ TEST_CASE("Placeable cases", "[backtracking][n_queens]") { 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()); + REQUIRE(b9.can_place_queens() == true); REQUIRE(b9.num_solutions() == 352); + // N = 11 NQueensSolver b11(11); - REQUIRE(b11.can_place_queens()); + REQUIRE(b11.can_place_queens() == true); REQUIRE(b11.num_solutions() == 2680); - }