您的位置:首页 > 产品设计 > UI/UE

leetcode: N-Queens

2014-05-08 19:00 399 查看
这道题的话以前的解法是递归,不过其实也可以写在一个函数里。

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
;
int i,j,x;
ArrayList<String[]> rst=new ArrayList<String[]>();
String[] B=null;
char[] Bline=new char
;

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
;
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode