對於一項任務,我負責使用Matlab和遞歸來設計NQueens算法。所以我設置它的方式是我有2個輔助函數isValid,它測試有效的位置,以及遞歸Queue,它從0的MxM板放置或移除一個皇后,並添加一個或從每一個可能的移動中刪除1可以使。爲了空間的緣故,我從recursiveQueen函數中刪除了add函數,但它所做的只是在8個方向上加1或減1。Matlab NQueens算法遞歸
我遇到的主要問題是在我的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