我试图递归地解决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]上。我无法弄清楚为什么。它还会跳过一些配置。我的递归有什么问题吗?
答案 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) {
与其他人相似。