解题思路:
回溯
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;
}
}
运行结果: