n皇后问题 (回溯法) 原创
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
n后问题
问题描述
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n 格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
算法分析
•解向量:(x1, x2, … , xn)
•显约束:xi=1,2, … ,n
•隐约束:
1)不同列:xi≠xj
2)不处于同一正、反对角线:|i-j|≠|xi-xj|
代码实现:
class Queen
{
friend int nQueen(int)
private:
bool Place(int k);
void Backtrack(int t);
int n, //皇后个数
*n; //当前解
long sum; //当前已找到的可行方案数
};
bool Queen::Place(int k)
{
for (int j=1;j if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false; return true; } void Queen::Backtrack(int t) { if (t>n) sum++; //达到叶结点 else for (int i=1;i<=n;i++) { //搜索子结点 x[t]=i; //进入第i个子结点 if (Place(t)) Backtrack(t+1); } } int nQueen(int n) { Queen X; //初始化X X.n=n; X.sum=0; int *p=new int [n+1]; for(int i=0;i<=n;i++) p[i]=0; X.x=p; X.Backtrack(1); //对整个解空间回溯搜索 delete []p; return X.sum; } 运行结果: