回溯法求解N皇后问题.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回溯法求解N皇后问题

算法的实现 假设回溯法要找出所有的答案结点 。 设(x1,x2,…,xi-1)是状态空间树中由根到一个结点的路径,而T(x1,…xi-1)是下述所有结点xi的集合,它使得对于每一个xi,(x1,x2,…,xi)是由根到一个结点xi的路径;假定还存在着一些限界函数Bi,如果路径(x1,x2,…,xi)不可能延伸到一个答案结点,则Bi(x1,x2,…,xi)取假值,否则取真值。 于是解向量X(1:n)中的第i个分量,就是那些选自集合T (x1,x2,…,xi-1)且使Bi为真的xi 算法8.4:可以放置一个新皇后吗? Procedure PLACE(k) //如果一个皇后能放在第k行和X(k)列,则返回true,否则返回false。X是一个全程数组,进入此过程时已置入了k个值。ABS(r)过程返回r的绝对值// global X(1:k); integer i,k; i?1 while ik do if X(i)=X(k) or ABS(X(i)-X(k))=ABS(i-k) then return (false) end if i?i+1 repeat return (true) End PLACE 算法8.5:n-皇后问题的解 Procedure NQUEENS(n) //此过程使用回溯法求出一个n*n棋盘上放置n个皇后,使其不能互相攻击的所有可能位置// integer k,n,X(1:n) X(1)?0 ; k?1 // k是当前行;X(k)是当前列 // while k0 do // 对所有的行,执行以下语句 // X(k)?X(k)+1 //移到下一列// while X(k)=n and Not PLACE(k) do //此处能放这个皇后吗// X(k)?X(k)+1 //不能放则转到下一列// repeat if X(k)=n then //找到一个位置// if k=n then print (X) //是一个完整的解则打印这个数组// else k?k+1;X(k)?0 //否则转到下一行// end if else k?k-1 //回溯// end if repeat End NQUEENS * Algorithm HHIT 8.1.3 回溯法的求解过程 由于问题的解向量X=(x1, x2, …, xn)中的每个分量xi(1≤i≤n)都属于一个有限集合Si={ai1, ai2, …, airi},因此,回溯法可以按某种顺序(例如字典序)依次考察笛卡儿积S1×S2×…×Sn中的元素。 初始时,令解向量X为空,然后,从根结点出发,选择S1的第一个元素作为解向量X的第一个分量,即x1= a11,如果X=(x1)是问题的部分解,则继续扩展解向量X,选择S2的第一个元素作为解向量X的第2个分量,否则,选择S1的下一个元素作为解向量X的第一个分量,即x1= a12。依此类推,一般情况下,如果X=(x1, x2, …, xi)是问题的部分解,则选择Si+1的第一个元素作为解向量X的第i+1个分量时,有下面三种情况: (1)如果X=(x1, x2, …, xi+1)是问题的最终解,则输出这个解。如果问题只希望得到一个解,则结束搜索,否则继续搜索其他解; (2)如果X=(x1, x2, …, xi+1)是问题的部分解,则继续构造解向量的下一个分量; (3)如果X=(x1, x2, …, xi+1)既不是问题的部分解也不是问题的最终解,则存在下面两种情况: ① 如果xi+1= ai+1k不是集合Si+1的最后一个元素,则令xi+1= ai+1k+1,即选择Si+1的下一个元素作为解向量X的第i+1个分量; ② 如果xi+1= ai+1k是集合Si+1的最后一个元素,就回溯到X=(x1, x2, …, xi),选择Si的下一个元素作为解向量X的第i个分量,假设xi= aik,如果aik不是集合Si的最后一个元素,则令xi= aik+1;否则,就继续回溯到X=(x1, x2, …, xi-1); 8.3.1 八皇后问题 八皇后问题是十九世纪著名的数学家高斯于1850年提出的。问题是:在8×8的棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。可以把八皇后问题扩展到n皇后问题,即在n×n的棋盘上摆放n个皇后,使任意两个皇后都不能处于同一行、同一列或同一斜线上。 若两个皇后摆放的位置分别是

文档评论(0)

5500046 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档