这道题的话以前的解法是递归,不过其实也可以写在一个函数里。
trace[i]表示第i行的皇后放置的位置,判断这个位置与之前的皇后是否冲突,用conflict函数检查。
x表示当前枚举到第几行,初始的时候trace[x]为-1,以后都是从trace[x]+1的位置枚举第x行皇后新的位置。
如果第x行能放皇后:
1.x不为最后一行的话,就继续到第x+1行;
2.x为最后一行,保存这一次的结果,继续回到最后一行,枚举trace[n-1]+1的位置,it‘s another story
如果第x行的所有位置都冲突了:
1.返回第x-1行,将trace[x]重新设为-1.
public class Solution {
public static ArrayList<String[]> solveNQueens(int n) {
int[] trace=new int[n];
int i,j,x;
ArrayList<String[]> rst=new ArrayList<String[]>();
String[] B=null;
char[] Bline=new char[n];
for(i=0;i<n;i++)
{
trace[i]=-1;
Bline[i]='.';
}
i=0;x=0;
while(true)
{
if(x<0)
break;
//find another suitble postion in col x
for(j=trace[x]+1;j<n;j++)
{
trace[x]=j;
if(conflict(trace,x)==false)
break;
}
//no suitble postion in col x;
if(j==n)
{
x=x-1;trace[x+1]=-1;continue;
}
//find pos
else
{
x=x+1;
//last col
if(x==n)
{
B=new String[n];
for(i=0;i<n;i++)
{
Bline[trace[i]]='Q';
B[i]=new String(Bline);
Bline[trace[i]]='.';
// System.out.println(B[i]);
}
rst.add(B);
x--;
continue;
}
//next col
}
}
return rst;
}
public static boolean conflict(int[] trace ,int pos)
{
int i;
for(i=0;i<pos;i++)
{
if(trace[i]==trace[pos] || Math.abs(trace[i]-trace[pos])==(pos-i))
return true;
}
return false;
}
}
本文介绍了一种解决N皇后问题的算法实现,采用迭代而非传统的递归方式。通过定义一个trace数组来记录每行皇后的位置,并使用conflict函数检查皇后间是否存在冲突。该算法能够找出所有可行的解决方案。
255

被折叠的 条评论
为什么被折叠?



