对于一项任务,我的任务是使用 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