回溯法n皇后问题

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、方法思想

回溯法是一个既带有系统性又带有跳跃性的搜索算法。它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。算法搜索至解空间树的任何一结点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯;否则进入该子树,继续按深度优先策略搜索。

代码实现:

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; }

相关文档
最新文档