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