Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Checkers多跳计数算法 我正在SFML检查程序中做我的第一个C++项目。 不幸的是,我发明了一个递归函数,它允许我检查每个可能的跳跃组合,并返回坐标_C++_Algorithm_Logic - Fatal编程技术网

Checkers多跳计数算法 我正在SFML检查程序中做我的第一个C++项目。 不幸的是,我发明了一个递归函数,它允许我检查每个可能的跳跃组合,并返回坐标

Checkers多跳计数算法 我正在SFML检查程序中做我的第一个C++项目。 不幸的是,我发明了一个递归函数,它允许我检查每个可能的跳跃组合,并返回坐标,c++,algorithm,logic,C++,Algorithm,Logic,我该怎么做?我搜索了很多网页,没有找到答案, 所以我想这比我想象的要容易 编辑#1: 这是树搜索问题的一个实例,其中节点是板,它们之间的边是一个特定的棋子,一次跳一次 对于给定的棋盘棋盘和位于pos位置的棋子,您可以确定它可以进行哪些跳跃: 如果没有可能的跳转,则多跳转序列结束。如果当前跳转列表不是空的,请按顺序报告它 如果有可能的跳跃,通过进行跳跃(从棋盘上移除跳过的棋子)并查看是否可以从该位置进行更多的跳跃来递归地探索每个跳跃 在pseudo-C++中,如下所示。请注意,这是出于教育目的

我该怎么做?我搜索了很多网页,没有找到答案, 所以我想这比我想象的要容易

编辑#1:


这是树搜索问题的一个实例,其中节点是板,它们之间的边是一个特定的棋子,一次跳一次

对于给定的棋盘
棋盘
和位于
pos
位置的棋子,您可以确定它可以进行哪些跳跃:

  • 如果没有可能的跳转,则多跳转序列结束。如果当前跳转列表不是空的,请按顺序报告它
  • 如果有可能的跳跃,通过进行跳跃(从棋盘上移除跳过的棋子)并查看是否可以从该位置进行更多的跳跃来递归地探索每个跳跃
在pseudo-C++中,如下所示。请注意,这是出于教育目的编写的,不考虑性能

// Assuming types pos and board were defined earlier.
using jump_list = std::vector<pos>;

// List of moves from a given starting position and board
std::vector<pos> possible_jumps(pos start, const board& board);

// Apply a move (remove the pawn from the board, move the jumping pawn)
board apply_move(const board& board, pos start, pos move);

// I'm bundling the multi-jump calculation in a struct to easily store
// the resulting jump list.
struct multi_jump {
    std::vector<jump_list> jumps;
    multi_jump(pos start, board board) {
        explore({}, start, board);
    }

    void explore(jump_list so_far, pos start, board board) {
        auto moves = possible_jumps(start, board);
        if (moves.empty()) {
            if (!so_far.empty()) {
                jumps.push_back(so_far);
            }
        } else {
            for (const auto move : moves) {
                board new_board = apply_move(board, start, move);
                jump_list new_so_far = so_far;
                new_so_far.push_back(move);
                explore(new_so_far, move, new_board);
            }
        }
    }
};

你已经有单跳的代码了吗?@NicoSchertler当然,它会检查所选棋子的位置+1格是否等于对手的棋子,以及棋子的位置+2是否自由(每个方向的代码相同)。(我将编辑主帖子并将其粘贴到那里)一种方法是将board state作为参数添加到该函数中。然后,根据您正在调查的跳跃修改状态(移除对手,更改自己棋子的位置),并从目标位置再次递归检查。
// Assuming types pos and board were defined earlier.
using jump_list = std::vector<pos>;

// List of moves from a given starting position and board
std::vector<pos> possible_jumps(pos start, const board& board);

// Apply a move (remove the pawn from the board, move the jumping pawn)
board apply_move(const board& board, pos start, pos move);

// I'm bundling the multi-jump calculation in a struct to easily store
// the resulting jump list.
struct multi_jump {
    std::vector<jump_list> jumps;
    multi_jump(pos start, board board) {
        explore({}, start, board);
    }

    void explore(jump_list so_far, pos start, board board) {
        auto moves = possible_jumps(start, board);
        if (moves.empty()) {
            if (!so_far.empty()) {
                jumps.push_back(so_far);
            }
        } else {
            for (const auto move : moves) {
                board new_board = apply_move(board, start, move);
                jump_list new_so_far = so_far;
                new_so_far.push_back(move);
                explore(new_so_far, move, new_board);
            }
        }
    }
};
jump_list jumps = multi_jump(start, board).jumps;