n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
思路:经典的回朔算法,写的比较丑陋,见谅。。。。
class Solution {
List<List<String>> ans=new ArrayList<List<String>>();
List<String> res=new ArrayList<String>();
boolean[][] flag=new boolean[30][30];
boolean[] mark=new boolean[30];
public List<List<String>> solveNQueens(int n) {
dfs(n,n,0);
return ans;
}
private void dfs(int num,int n,int row)
{
if(num==0)
{
StringBuilder tmp=new StringBuilder();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(flag[i][j])
tmp.append('Q');
else
tmp.append('.');
}
res.add(tmp.toString());
tmp.delete(0, tmp.length());
}
ans.add(new ArrayList<String>(res));
res.clear();
return;
}
for(int i=0;i<n;i++)
{
if(!canPut(row,i,n))
continue;
mark[i]=true;
flag[row][i]=true;
dfs(num-1,n,row+1);
mark[i]=false;
flag[row][i]=false;
}
}
private boolean canPut(int row,int col,int n)
{
boolean isOk=true;
int x=row-1,y=col-1;
while(x>=0 && y>=0)
{
if(flag[x][y])
{
isOk=false;
break;
}
x--;y--;
}
x=row-1;y=col+1;
while(x>=0 && y<n)
{
if(flag[x][y])
{
isOk=false;
break;
}
x--;y++;
}
if(mark[col]) isOk=false;
return isOk;
}
}