经典的N皇后问题,记录列和两条对角线的占据情况;按行遍历所有可能的皇后放置位置并回溯;将所有可能的结果记录并返回....
两个注意的地方:
1. 由于已找到的情况会被回溯,所以在加入结果集合中时,要用一个新的对象
2. 最初我是用数组保存列和对角线的占据情况,但是超时;后来换成HashSet后即可;说明HashSet在add和remove上的效率要高与数组指定的位置的修改
public class Solution {
Set<Integer> col = new HashSet<Integer>();
Set<Integer> dial = new HashSet<Integer>();
Set<Integer> diar = new HashSet<Integer>();
public List<List<String>> solveNQueens(int n) {
List<List<String>> res= new ArrayList<List<String>>();
List<String> list=new ArrayList<String>();
// col=new int[n];
// dial=new int[2*n];
// diar=new int[2*n];
dfs(res,list,0,n);
return res;
}
public void dfs( List<List<String>> res,List<String> list,int row,int n )
{
if( row==n )
{
res.add( new ArrayList<String>(list) );
return ;
}
for( int i=0;i<n;i++ )
{
// if( col[i]==1||dial[i+n-1-row]==1||diar[i+row]==1 )
if( col.contains(i)||dial.contains(i+n-1-row)||diar.contains(i+row) )
{
continue;
}
String line="";
for( int j=0;j<n;j++ )
{
if( j==i )
{
line+='Q';
}
else
{
line+='.';
}
}
list.add(line);
col.add(i);
dial.add(i+n-1-row);
diar.add(i+row);
dfs( res,list,row+1,n);
list.remove(list.size()-1);
col.remove(i);
dial.remove(i+n-1-row);
diar.remove(i+row);
}
}
}