0

我正在尝试以递归方式解决 8x8 棋盘上的 n-knights 问题。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] 上放置一个骑士。我不知道为什么。它还跳过了一些配置。我的递归有问题吗?

4

1 回答 1

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) {

对其他人也是如此。

于 2013-11-08T12:19:50.423 回答