leetcode上面關於n皇后有兩道題目:
51 n-queens:
52 n-queens ii:
兩道題目其實差不多,一題是只要返回解的個數就可以了,一題是返回所有的解,做起來一模一樣。
什麼是n皇后問題?我們需要在乙個n*n的棋盤上,放置n個皇后,使這些皇后不能互相攻擊(即兩個皇后之間不能處於同一行、同一列或者是同一斜線上),我們要求滿足這個條件的所有解。
我採用的是回溯法去解決n皇后問題:
我們先在第一列放置乙個皇后,然後在第二列與第一列不衝突的位置再放皇后,在第三列與第一列、第二列不衝突的位置放皇后……執行這樣的操作,一直到第n列,我們就得到乙個解了。
怎麼回溯呢?我們可以想象成一棵樹。假設我們在第一列的第一行放置了皇后,然後遞迴模擬了所有情況後,把第一列的第一行的皇后放到第二行,繼續遞迴模擬所有情況。一直到把所有解都得出來。
下面看看leetcode的具體題目:
51 n-queens:
題目:
**:
class52 n-queens ii:solution
}helper(res, queens,
0, n);
return
res;
}void helper(vectorstring>> &res, vector queens, int j, int
n)
for (int i = 0; i < n; i++) }}
bool isvalid(vector s, int i, int
j)
for (int k = 0; k < s.size(); k++)
for (int m = i + 1, n = j + 1; m < s.size() && n < s.size(); m++, n++)
for (int m = i + 1, n = j - 1; m < s.size() && n >= 0; m++, n--)
for (int m = i - 1, n = j - 1; m >= 0 && n >= 0; m--, n--)
for (int m = i - 1, n = j + 1; m >= 0 && n < s.size(); m--, n++)
return
true
; }
};
題目:**:
class除了原來的函式,我們用到了乙個用於回溯的helper函式,乙個用於檢測當前位置是否可放置皇后的函式。solution
}int res = 0
; helper(res, queens,
0, n);
return
res;
}void helper(int &res, vector queens, int j, int
n)
for (int i = 0; i < n; i++) }}
bool isvalid(vector queens, int i, int
j)
for (int k = 0; k < queens.size(); k++)
for (int m = i - 1, n = j - 1; m >= 0 && n >= 0; m--, n--)
for (int m = i + 1, n = j - 1; m < queens.size() && n >= 0; m++, n--)
for (int m = i - 1, n = j + 1; m >= 0 && n < queens.size(); m--, n++)
for (int m = i + 1, n = j + 1; m < queens.size() && n < queens.size(); m++, n++)
return
true
; }
};
leetcode n皇后問題 回溯法
總體思路 使用乙個陣列記錄每行放置的皇后的列下標,依次在每一行放置乙個皇后。同時增加約束條件,即新放置的皇后不能和任何乙個已經放置的皇后在同一列以及同一條斜線上,並更新陣列中的當前行的皇后列下標。當找到乙個可能的解之後,將陣列轉換成表示棋盤狀態的列表,並將該棋盤狀態的列表加入返回列表。因為我們遍歷每...
問題 I n皇后問題
在n n 格的棋盤上放置彼此不受攻擊的n 個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n個皇后,任何2 個皇后不放在同一行或同一列或同一斜線上。設計乙個解n 後問題的佇列式分支限界法,計算在n n個方格上放置彼此不受攻擊的n個皇...
八皇后問題 2n皇后問題
問題描述 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處在同一行 同一列或同一斜線上。解決思路 解決八皇后問題不難,主要是應用到了遞迴回溯的方法,本質上也是一種列舉法。從棋盤的第一行開始嘗試擺放第乙個皇后,擺放成功之後,遞迴一層,再遵循規則在棋盤第二行來擺放第二個皇后。如...