Matlab中的nquiens算法递归
在一项作业中,我的任务是使用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,直到所有行都包含一个皇后(我没有在中编码此步骤)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
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