本人电子系,只为一学生。心喜计算机,小编以怡情。
没什么好讲的,这里给出LintCode能通过的代码
参考书:《算法设计与分析》 李春葆主编 清华大学出版社 43页求解N皇后问题
static public ArrayList<ArrayList<String>> solveNQueens(int n) {
// write your code here
List<ArrayList<String>> ret=new ArrayList<>();
ArrayList<String> str=new ArrayList<>();
int []q=new int [n+1];
int k=1;
queue(k, n, ret, str,q);
return (ArrayList<ArrayList<String>>) ret;
}
//主要递归部分
static void queue( int k,int n,List<ArrayList<String>> ret,ArrayList<String> str,int q[])
{
int j;
if(k>n)
{
ret.add(new ArrayList<String>(topicture(q, n, str)));
str.removeAll(str);
}
else
{
for(j=1;j<=n;j++)
if(ispossible(k, j,q))
{
q[k]=j;
queue(k+1, n, ret, str, q);
}
}
}
//将数组转化成要求的格式
static ArrayList<String> topicture(int q[],int n,ArrayList<String> str)
{
for(int i=1;i<=n;i++)
{
String s="";
for(int j=1;j<=n;j++)
{
if(j==q[i])
s+="Q";
else {
s+=".";
}
}
str.add(s);
}
return str;
}
//判断是否能放置的函数
static boolean ispossible(int k,int j,int q[])
{
int i=1;
while(i<k)
{
if(q[i]==j||(Math.abs(q[i]-j)==Math.abs(k-i)))
return false;
i++;
}
return true;
}