递归 N-骑士问题

Recursive N-knightsproblem

本文关键字:问题 骑士 递归      更新时间:2023-10-16

我正在尝试递归解决 8x8 棋盘上的 n 骑士问题。n-knights问题是n-queens问题的变体,其中女王被骑士取代。没有一块可以拿走另一块。

到目前为止,我的代码:http://pastebin.com/TVza3jVU。

输入包括必须放在棋盘上的骑士数量。我的代码打印了很多正确的板

输出如下所示(示例):

0 0 0 0 0 0 0 0  0
0 0 0 0 0 0 0 0  1
0 0 0 0 0 0 0 0  2
0 0 0 0 0 0 0 0  3
0 0 0 0 0 0 0 0  4
0 0 0 0 0 0 0 0  5
0 0 0 0 0 0 1 0  6
1 1 0 1 0 1 0 0  7
0 1 2 3 4 5 6 7
nrBoards = 49

"1"代表骑士。


我的问题如下:

0 1 1 1 1 1 0 0  0
0 0 0 0 0 0 0 0  1
0 0 0 0 0 0 0 0  2
0 0 0 0 0 0 0 0  3
0 0 0 0 0 0 0 0  4
0 0 0 0 0 0 0 0  5
0 0 0 0 0 0 0 0  6
0 0 0 0 0 0 0 0  7
0 1 2 3 4 5 6 7

这是我的脚本将打印的最后一块板。它永远不会把骑士放在[0][0][0]上。我不知道为什么。它还会跳过一些配置。我的递归有问题吗?

从您链接的代码来看,似乎您的 checkplace() 函数存在一个问题。您不检查 x+2、x-2、y+2、y-2 等的边界是否在区间 0 到 7 之内或之外。

int checkPlace(int y, int x, chessboard boards) {
    if (boards.board[y - 2][x - 1] == 1) {
      return 0;
    }
    if (boards.board[y - 1][x - 2] == 1) {
      return 0;
    }
    if (boards.board[y - 2][x + 1] == 1) {
      return 0;
    }
    if (boards.board[y - 1][x + 2] == 1) {      
      return 0;
    }
    if (boards.board[y + 1][x + 2] == 1) {
      return 0;
    }
    if (boards.board[y + 1][x - 2] == 1) {      
      return 0;
    }
    if (boards.board[y + 2][x - 1] == 1) {
      return 0;
    }
    if (boards.board[y + 2][x + 1] == 1) {
      return 0;
    }
    return 1;
}

相反:

if ( x-1 >= 0 && y-2 >= 0 && boards.board[y - 2][x - 1] == 1) {

其他人也是如此。