Matlab中的nquiens算法递归

Matlab中的nquiens算法递归,matlab,recursion,n-queens,Matlab,Recursion,N Queens,在一项作业中,我的任务是使用Matlab和递归设计一个NQueens算法。所以我设置它的方法是我有两个助手函数isValid,它测试有效的位置,和recursiveQueen,它从一个0的MxM板上放置或移除一个queen,并从queen可以进行的每个可能的移动中添加一个或移除1。为了节省空间,我从recursiveQueen函数中删除了add函数,但它所做的只是在8个方向上加1或减1 我遇到的主要问题是在solveNQ函数中,如果前一行没有找到解决方案,就让它转到下一列。我已将我的步骤分解为6

在一项作业中,我的任务是使用Matlab和递归设计一个NQueens算法。所以我设置它的方法是我有两个助手函数isValid,它测试有效的位置,和recursiveQueen,它从一个0的MxM板上放置或移除一个queen,并从queen可以进行的每个可能的移动中添加一个或移除1。为了节省空间,我从recursiveQueen函数中删除了add函数,但它所做的只是在8个方向上加1或减1

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

1) 把王后放在第一排

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

3) 重复步骤2,直到找不到行的有效位置

4) 将女王从最后一排移走

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

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


j=不需要第二个循环,因为col+1允许您进入下一列

我的概念如下

1) 在左上角放一个皇后

2) 移动到下一列并在其有效位置放置皇后

3) 重复步骤2,现在我们进入第3列。如果你不能把任何皇后放在那里,那么移除之前的皇后。当前代码的主要问题可以通过在if语句中移动queen remove来解决。这背后的逻辑是,当不能在该列中放置皇后时,for循环将在不实际执行任何操作的情况下运行(因为isValid为false)。当for循环(这是递归中的for循环)停止运行时,MATLAB将选择它之前停止的位置,即您的克隆解算器,并跳到下一行,在那里您应该删除queen

不要忘记,如果n>col,这意味着您可以在电路板上放置n个皇后,那么您的输出是正确的

我还得有个朋友帮我解决这个问题。如果我的解释不好,请随时回复

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