Skip to content

Commit

Permalink
Рекурсивно решение на ход на коня
Browse files Browse the repository at this point in the history
  • Loading branch information
triffon committed Oct 20, 2022
1 parent f237d8c commit c9d55e2
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 5 deletions.
2 changes: 1 addition & 1 deletion lectures/1/horse/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ project(horse VERSION 0.1.0)
include(CTest)
enable_testing()

add_executable(horse main.cpp recursive_horsewalker.cpp)
add_executable(horse main.cpp horsewalker.cpp recursive_horsewalker.cpp)
include_directories(../common ../stack)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
Expand Down
36 changes: 36 additions & 0 deletions lectures/1/horse/horse_tests.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,43 @@
#include "recursive_horsewalker.hpp"

TEST_CASE_TEMPLATE("Никъде не можем да стигнем от невалидна стартова позиция",
AnyHorseWalker, RecursiveHorseWalker) {
AnyHorseWalker horseWalker(4);
CHECK_FALSE(horseWalker.existsWalk({-1, 0}, {3, 3}));
}

TEST_CASE_TEMPLATE("Не можем да стигнем до невалидна крайна позиция",
AnyHorseWalker, RecursiveHorseWalker) {
AnyHorseWalker horseWalker(4);
CHECK_FALSE(horseWalker.existsWalk({0, 0}, {3, 5}));
}

TEST_CASE_TEMPLATE("Началната и крайната позиция съвпадат",
AnyHorseWalker, RecursiveHorseWalker) {
AnyHorseWalker horseWalker(4);
CHECK(horseWalker.existsWalk({0, 0}, {0, 0}));
}

TEST_CASE_TEMPLATE("На дъска 4x4 можем да стигнем от (0,0) до (3,3)",
AnyHorseWalker, RecursiveHorseWalker) {
AnyHorseWalker horseWalker(4);
CHECK(horseWalker.existsWalk({0, 0}, {3, 3}));
}

TEST_CASE_TEMPLATE("На дъска 4x4 можем да стигнем от (0,0) до (2,2)",
AnyHorseWalker, RecursiveHorseWalker) {
AnyHorseWalker horseWalker(4);
CHECK(horseWalker.existsWalk({0, 0}, {2, 2}));
}

TEST_CASE_TEMPLATE("На дъска 4x4 можем да стигнем от (0,0) до (0,1)",
AnyHorseWalker, RecursiveHorseWalker) {
AnyHorseWalker horseWalker(4);
CHECK(horseWalker.existsWalk({0, 0}, {0, 1}));
}

TEST_CASE_TEMPLATE("На дъска 3x3 не можем да стигнем от (0,0) до (1,1)",
AnyHorseWalker, RecursiveHorseWalker) {
AnyHorseWalker horseWalker(3);
CHECK_FALSE(horseWalker.existsWalk({0, 0}, {1, 1}));
}
15 changes: 15 additions & 0 deletions lectures/1/horse/horsewalker.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#include "horsewalker.hpp"

HorseWalker::HorseWalker(size_t size) {
initBoard(size);
}

void HorseWalker::initBoard(size_t size) {
for(size_t i = 0; i < size; i++)
board.push_back(ChessRow(size));
}

bool HorseWalker::insideBoard(Position const& pos) const {
return pos.first >= 0 && pos.first < board.size() &&
pos.second >= 0 && pos.second < board.size();
}
14 changes: 13 additions & 1 deletion lectures/1/horse/horsewalker.hpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
#ifndef __HORSE_WALKER
#define __HORSE_WALKER
#include <cstddef>
#include <utility>
#include <vector>

using Position = std::pair<int, int>;
// TODO: да се реализира чрез std::array
using ChessRow = std::vector<bool>;
using ChessBoard = std::vector<ChessRow>;

class HorseWalker {
protected:
ChessBoard board;
void initBoard(size_t size);
bool insideBoard(Position const& pos) const;
public:
virtual bool existsWalk(Position const& start, Position const& end) const = 0;
HorseWalker(size_t size = 8);

// проверява дали има разходка на коня от start до end
virtual bool existsWalk(Position const& start, Position const& end) = 0;
virtual ~HorseWalker() {}
};

Expand Down
21 changes: 19 additions & 2 deletions lectures/1/horse/recursive_horsewalker.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,24 @@
#include <cmath>
#include "recursive_horsewalker.hpp"

RecursiveHorseWalker::RecursiveHorseWalker(size_t size) {}
RecursiveHorseWalker::RecursiveHorseWalker(size_t size) : HorseWalker(size) {}

bool RecursiveHorseWalker::existsWalk(Position const& start, Position const& end) {
if (!insideBoard(start) || !insideBoard(end) || board[start.first][start.second])
return false;

if (start == end)
return true;

board[start.first][start.second] = true;

for(int dx = -2; dx <= 2; dx++)
if (dx != 0)
for (int sign : {-1, 1}) {
int dy = sign * (3 - std::abs(dx));
if (existsWalk({start.first + dx, start.second + dy}, end))
return true;
}

bool RecursiveHorseWalker::existsWalk(Position const& start, Position const& end) const {
return false;
}
2 changes: 1 addition & 1 deletion lectures/1/horse/recursive_horsewalker.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
class RecursiveHorseWalker : public HorseWalker {
public:
RecursiveHorseWalker(size_t size = 8);
bool existsWalk(Position const& start, Position const& end) const;
bool existsWalk(Position const& start, Position const& end);
};

#endif

0 comments on commit c9d55e2

Please sign in to comment.