太原工业学院算法设计与分析-n后问题
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
fore(ilnstej=1;j<k;j++)
//若//|k依-j|次=|尝x[试k]将-x[当j]|前,或皇x[后k]放=x在[j],各则个冲列突
if(f(oMart(hi.natbsi(=k-1j);=i=<M=atnh;.ai+bs+(x)[{j]-x[k]))||(x[j]==xu/e若; 可以放置在t列,则继续放置下一个
2.算法设计
解向量:(x1, x2, … , xn), xi表示皇后i放在棋盘的第i 行的第xi列上.
可行解空间:排列树
显约束:xi=1,2, … ,n (列的取值范围) 隐约束:
1) 不同列:xixj 2) 不处于同一正、反对角线上:|i-j||xi-xj|
函数Place:来测试若将皇后k放在xk列,是否与前面 已放置的k-1个皇后都不在同一列,且不在同一斜线 上。
pupbrlicvasttaeticstloantgicnQvuoeiedn(binatcnknt)ra{ck(int t)
{ n=nn;
sum/=/0若; 为叶子结点,则为可行解
x=nife(wt>innt )[n{+1];
for(intsi=u0m;i<+=n+;i+;+/)/可x[行i]=解0; 数目增1
回溯法解n后问题,用一棵完全n叉树来表示其解空 间。用可行性约束函数place可剪去不满足行、列和 斜线约束的子树。
public class NQueen1 {
static int n; //皇后个数 static int [] x; //当前解 static long sum; //当前已找到的可靠方案数
5.5 n后问题
1 问题的描述
在n×n格的棋盘上放置彼此不受攻击的 n个皇后。按照国际象棋的规则,皇后可 以攻击与之处在同一行或同一列或同一 斜线上的棋子。
n后问题等价于在n×n格的棋盘上放置n 个皇后,任何2个皇后不放在同一行或同 一列或同一斜线上。
1
Q
2
Q
3
Q
4
Q
5
Q
6Q
7
Q
8
Q
1 2345678
backtra/ck/(输1);出当前解
returnfsoumr(;int i=0;i<x.length;i++)
}
System.out.print (x[i]+" ");
private staStyicstbeomole.oauntp.plarcien(tilnnt(k);) {
//判}断当前第k个皇后,是否与前k-1个冲突
}
if(place(t))backtrack(t+1);
}
}