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;
}
}
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;
}
}
相关文章推荐
- LeetCode51——N-Queens
- 129_leetcode_N-Queens
- LeetCode: N-Queens
- N-Queens leetcode java
- LeetCode 51. N-Queens--Python实现
- Leetcode: N-Queens
- LeetCode 051 N-Queens
- leetcode: 51. N-Queens
- LeetCode N-Queens
- N-Queens -- LeetCode
- leetcode--n_queens&&n_queens_II
- leetcode: N-Queens
- 【LeetCode】N-Queens
- LeetCode(N-Queens)
- N-Queens II N皇后问题(有几种放法)@LeetCode
- [LeetCode]N-Queens
- N-Queens -- leetcode
- N-Queens--LeetCode
- leetcode—N-Queens系列
- LeetCode - N-Queens I && II