基于回溯法的排列宝石问题.doc

想预览更多内容,点击预览全文

申明敬告:

本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己完全接受本站规则且自行承担所有风险,本站不退款、不进行额外附加服务;如果您已付费下载过本站文档,您可以点击这里二次下载

文档介绍

基于回溯法的排列宝石问题

摘要 本文采用回溯法对排列宝石问题进行分析,详细描述回溯法求解问题时算法的基本思想,并给出具体的算法设计和时间复杂度分析,最后对回溯法进行了总结。

关键字 回溯法 排列宝石问题 时间复杂度 递归

1 排列宝石问题描述:设有n种不同的颜色,同一种形状的n颗宝石分别具有这种不同的颜色。现有n种不同的形状的宝石共n2课,欲将这n2颗宝石排列成n行n列的一个方阵使方阵中每一行每一列的宝石都有n种不同的形状和n种不同颜色。设计一个算法计算出对于给定的n有多少种不同的宝石排列方案。

2 算法设计思想?

确定包含问题的所有解的解空间树,,在包含问题所有解的空间树中,按照深度优先的策略,从开始结点(根结点)出发搜索解空间树。这个开始节点称为活结点,同时也称为当前扩展结点。在当前扩展接点处,探索向纵深方向一直一个新结点。这个新结点成为新的活结点,并成为当前扩展接点。如果当前扩展接点不能再向纵深方向移动,则当前扩展结点就成为死结点。此时,应往回移动(回溯)到最近的活结点,并使这个活结点成为当前扩展结点。回溯法以这种方式递归的在解空间中搜索,直至找到所要求的解或解空间中已无活结点为止。为了提高回溯发的搜索效率,避免无效搜索,用回溯法搜索至解空间树的任一结点时,总是用剪枝函数先判断该结点是否满足问题的约束条件。如果满足进入该子树,继续按深度优先的策略进行搜索。否则,不去搜索以该结点为根的子树,而是逐层向其祖先结点回溯。在排列宝石问题中回溯法用剪枝函数剪去导致不可行的子树。

3 分析问题

基本思路:首先,初始化n2颗宝石,将n2颗宝石按照每行颜色相同,形状各不相同,每列形状相同,颜色各不相同,排列到矩阵中,并用从 1~n2个数从左到右从上到下一次编号,并用?a[i].use=1;??表示宝石未被使用。可通过

?for(int?i=1;i<=N*N;i++)??????

最近下载