51. N皇后
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
注意:我怕我把回溯算法忘了,闲着没事就理解理解一遍
class Solution {
public List<List<String>> solveNQueens(int n) {
//h代表/方向对角线,r代表\方向对角线
boolean []row=new boolean[n];
boolean []h=new boolean[2*n];
boolean[]r=new boolean[2*n];
List<List<String>>ans=new ArrayList<List<String>>();
dfs(n,row,h,r,new ArrayList<Integer>(),0,ans);
return ans;
}
public void dfs(int n,boolean []row,boolean []h,boolean []r,ArrayList<Integer>curList,int curk,List<List<String>>ans)
{
if(curk==n)
{
List<String>temp=new ArrayList<>();
for(Integer integer:curList)
{
String st="";
for(int i=0;i<n;i++)
{
if(i==integer)
st+="Q";
else
st+=".";
}
temp.add(st);
}
ans.add(temp);
}
for(Integer i=0;i<n;i++)
{
if(!row[i]&&!h[curk+i]&&!r[curk-i+n])
{
row[i]=true;
h[curk+i]=true;
r[curk-i+n]=true;
curList.add(i);
dfs(n,row,h,r,curList,curk+1,ans);
curList.remove(i);
row[i]=false;
h[curk+i]=false;
r[curk-i+n]=false;
}
}
}
}