?先建立一個二維數(shù)組,把所有元素替換為.;
?從第一列開始遞歸;
?當(dāng)列達(dá)到n時,中止條件;
?不滿足情況的條件是同行有元素,或未遍歷的列45度角或135度角有元素,row指代列,然后從row-1開始行-1或行+1遍歷即可。
class Solution {
List<List<String>> res = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
char[][] chessboard = new char[n][n];
for (char[] c : chessboard) {
Arrays.fill(c, '.');
}
backTrack(n, 0, chessboard);
return res;
}
public void backTrack(int n, int row, char[][] chessboard) {
if (row == n) {
res.add(Array2List(chessboard));
return;
}
for (int col = 0;col < n; ++col) {
if (isValid (row, col, n, chessboard)) {
chessboard[row][col] = 'Q';
backTrack(n, row+1, chessboard);
chessboard[row][col] = '.';
}
}
}
public List Array2List(char[][] chessboard) {
List<String> list = new ArrayList<>();
for (char[] c : chessboard) {
//該方法會創(chuàng)建一個新的 String 對象,并將傳入的字符數(shù)組的內(nèi)容復(fù)制到新字符串中.底層實(shí)際是new String(char[]) 的封裝。
list.add(String.copyValueOf(c));
}
return list;
}
public boolean isValid(int row, int col, int n, char[][] chessboard) {
// 檢查列
for (int i=0; i<row; ++i) { // 相當(dāng)于剪枝
if (chessboard[i][col] == 'Q') {
return false;
}
}
// 檢查45度對角線
for (int i=row-1, j=col-1; i>=0 && j>=0; i--, j--) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
// 檢查135度對角線
for (int i=row-1, j=col+1; i>=0 && j<=n-1; i--, j++) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
return true;
}
}