2013-03-21 79 views
1

對於一項任務,我負責使用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 

回答

0

你不會需要對於j第二循環=因爲你的山坳+ 1將允許你轉移到下一列。

我的概念如下

1)將一張大號在左上角

2)移動到下一列和放置大號其中它是有效的

3)重複第2步,現在我們在第3列。如果你不能在那裏放置任何皇后,那麼刪除以前的皇后。當前代碼的主要問題可以通過移動if語句中的女王移除來解決。這背後的邏輯是,當沒有皇后可以放在該列中時,for循環將運行而不實際執行任何操作(因爲isValid爲false)。當for循環(這是遞歸內部的for循環)停止運行時,MATLAB將從之前停止的地方(這是你的克隆solveNQ)跳到下一行,在那裏你應該刪除你的皇后。

不要忘記,如果n> col,這意味着您可以將N皇后置於主板上,那麼您的輸出是真實的。我不得不有一個朋友幫我解決這個問題。如果我的解釋不好,請隨時回覆。