【leetcode】51. (Hard) N-Queens
阿新 • • 發佈:2018-11-19
解題思路:
回溯
res用於存放所有的結果
positions用於記錄當前已經擺放好的有效的皇后的位置
columns是一個一維陣列,長度為n。用於記錄第一排、第二排、第三排…的皇后的位置(所在的列)。
主體函式是solveNQueens.
newDistrubution是回溯函式,用於檢測當前行(row)中各個列的位置是否有效。邊界是row當前行數,如果當前行數已經計算到n(行數從0…n-1),則將positions所有皇后所在位置的二維陣列轉化成List<List< String >>的格式,並將結果存到最終結果res(result)裡。
IsValid函式用檢測將queen放在當前row的當前column裡面是否有效。
提交程式碼:
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> res=new ArrayList<List<String>>();
int[][] positions=new int[n][n];
int[] columns=new int[n];
for(int i=0;i<n;i++)
columns[i]=- 1;
newDistribution(0,n,res,positions,columns);
return res;
}
public void newDistribution(int row,int n,
List<List<String>> res,int[][] positions,int[] columns) {
/* row: current row
* n: the size of the chess
* res: result
* positions: present valid queens' positions we have
* columns: columns where current queens have occupied
*/
if(row==n) {
res.add(turnArraysToList(positions,columns));
return;
}
for(int i=0;i<n;i++) {
positions[row][i]=1;
if(isValid(row,positions,columns,i)) {
columns[row]=i;
newDistribution(row+1,n,res,positions,columns);
}
columns[row]=-1;positions[row][i]=0;
}
}
public boolean isValid(int row,int[][] positions,int[] columns,int column) {
/* check if the new column in row is valid
* row: current row
* positions: the positions of current queens we have
* columns: the columns of current queens occupy
* */
//check the volumn
for(int i=0;i<row;i++)
if(columns[i]==column)
return false;
//check the diagonal
for(int i=0;i<row;i++) {
if(row-i==(column-columns[i]))
return false;
else if(row-i==columns[i]-column)
return false;
}
return true;
}
public List<String> turnArraysToList(int[][] positions,int[] columns){
/*turn the 2-dimension arrays to List<String>*/
List<String> result=new ArrayList<String>();
for(int i=0;i<positions.length;i++) {
String str="";
for(int j=0;j<columns[i];j++)
str+=".";
str+="Q";
for(int j=0;j<positions.length-columns[i]-1;j++)
str+=".";
result.add(str);
}
return result;
}
}
執行結果: