n皇后问题的解空间有n^n个解,算法的目的是从所有解中找出可行解的个数。
非递归算法实现步骤
在当前第k行下找出可以放置皇后的列坐标
–if
(找到的列坐标小于n){
—- if
(已经到最后一行) 则产生一个可行解
—-else
未到叶节点则向下一行扫描
– }else
回溯到父节点
代码如下:
public class test5_5_2 {
static int n; //皇后个数
static int[] x; //当前解
static long sum; //当前已找到的可行方案数
private static void nQueen2(int nn){
n = nn;
sum = 0;
x = new int[n+1];
for(int i=0;i<=n;i++) x[i] = 0;
backtrack();
}
private static boolean place(int t){
for(int i=1;i<t;i++)
if((Math.abs(t-i)==Math.abs(x[t]-x[i]))||(x[i]==x[t]))
return false;
return true;
}
private static void backtrack(){
x[1] = 0;
int k = 1; //第一行
while(k>0){
//若出现第一个可行解,即此时k=n,需要把最后一行确定的列坐标+1,避免出现一个解就死循环当前解
x[k] += 1;
while((x[k]<=n)&&(!place(k))) x[k] += 1; //列数+1
if(x[k]<=n){
if(k==n) sum++;
else{
k++; //向下一行扫描
x[k] = 0; //下一行的确定列初始为"0"
}
}else k--; //回溯到上一行,排列树中则回溯到父节点
}
}
public static void main(String[] args) {
n = 8;
nQueen2(n);
System.out.println(n+"个皇后共有:"+sum+"种解");
}
}
运行结果如下:
4个皇后共有:2种解
8个皇后共有:92种解
总结:利用数组x
所含信息,可将上述回溯法表示成非递归形式,进一步省去O(n)递归栈空间。