n皇后问题 (回溯法) 原创

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

运行结果:

相关文档
最新文档