1

对于一项任务,我的任务是使用 Matlab 和递归设计一个 NQueens 算法。所以我设置它的方式是我有 2 个辅助函数 isValid,它测试有效的放置,以及 recursiveQueen,它从 0 的 MxM 板上放置或删除一个皇后,并从每一个可能的移动中添加一个或删除一个皇后可以使。为了空间,我从 recursiveQueen 函数中删除了 add 函数,但它所做的只是在 8 个方向上加或减 1。

我遇到的主要问题是在我的 solveNQ 函数中,如果没有为前一行找到解决方案,它会转到下一列。我将步骤分解为 6 ​​件事:

1)在第一排放置一个皇后

2)在下一行的下一个有效位置放置一个皇后

3) 重复第 2 步,直到没有找到该行的有效位置

4)从最后一行删除女王

5)将皇后放在该行的下一个有效位置

6)重复步骤 1-5 直到所有行都包含一个皇后(我没有编码这一步)

function out = NQueens(m) %main function
board = zeros(m,m); %intializes board
out = solveNQ(1,board) %recursive function
end

function out = solveNQ(col,board)
n = length(board);
out = false; %returns false if no solutions found
if col > n  
else
    for i = col:n 
        for j = 1:n
            if isValid(board,i,j)
                board = recursiveQueen(board,i,j,'place') %place queen
                out = solveNQ(col+1,board) %recursive call
            end
        end
        board = recursiveQueen(board,i-1,col,'remove') %if no valid placement for row
        out = solveNQ(col-1,board) %try again
    end
end
end


function out = isValid(board,row,col)
    if board(row,col) == 0
       out = true;
    else
       out = false;
end

function board = recursiveQueen(board,row,col,move)
board = goRight(board,row,col,move); %right
board = goLeft(board,row,col,move); %left
board = goDown(board,row,col,move); %down
board = goUp(board,row,col,move); %up
board = goRightUp(board,row,col,move); %diagnol up right
board = goLeftUp(board,row,col,move); %diagnol up left
board = goRightDown(board,row,col,move); %diagnol right down
board = goLeftDown(board,row,col,move); %diagnol left down
    if strcmp(move,'place') %places queen
        board(row,col) = -1; 
    elseif strcmp(move,'remove') %removes queen
        board(row,col) = 0;
     end
end
4

1 回答 1

0

您不需要 j= 的第二个循环,因为您的 col+1 将允许您移动到下一列。

我的概念如下

1)在左上角放置一个皇后

2)移动到下一列并在有效的地方放置一个皇后

3) 重复第 2 步,所以现在我们在第 3 列。如果您不能在其中放置任何皇后,则删除前一个皇后。您当前代码的主要问题可以通过在 if 语句中移动 Queen remove 来解决。这背后的逻辑是,当该列中不能放置皇后时,for 循环将运行而不实际执行任何操作(因为 isValid 为 false)。当 for 循环(这是递归内部的 for 循环)停止运行时,MATLAB 会从之前停止的地方开始,即您的克隆 solveNQ,并跳转到下一行,您应该在其中删除您的皇后。

不要忘记,如果 n>col,这意味着您可以将 N 个皇后放在棋盘上,则您的输出为真。

我也必须有一个朋友帮助我解决这个问题。如果我的解释不好,请随时回复。

于 2013-03-24T05:48:57.627 回答