递归的N-knights问题

时间:2013-11-08 12:05:40

标签: c++ c recursion n-queens

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

到目前为止我的代码: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]上。我无法弄清楚为什么。它还会跳过一些配置。我的递归有什么问题吗?

1 个答案:

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

与其他人相似。