n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4 输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。
private static List<List<String>> solveNQueens(int n) {
List<List<String>> listAll=new ArrayList<List<String>>();
int[] arr=new int[n];
dfs(listAll,arr,n,0);
return listAll;
}
private static void dfs(List<List<String>> listAll,int[] arr,int n,int row){
if(row==n){ //已经循环了n行
List<String> list=new ArrayList<String>();
for(int i=0;i<n;i++){
StringBuilder sb = new StringBuilder(); //可以改变string长度
for(int j=0;j<n;j++){
if(arr[i]==j)
sb.append("Q");
else
sb.append(".");
}
list.add(sb.toString());
}
listAll.add(list);
return;
}
for(int i=0;i<n;i++){ //i列
arr[row]=i;
if(judge(arr,row)){
dfs(listAll,arr,n,row+1);
}
}
}
/*检查第n行与第n-1行是否有冲突
1.是否处于同一列
2.是否属于同一斜线*/
private static boolean judge(int[] arr,int row){
for(int i=0;i<row;i++){
if(arr[i]==arr[row] || Math.abs(row-i)==Math.abs(arr[row]-arr[i]))
return false;
}
return true;
}