回溯法求解N皇后问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HHIT
Algorithm
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个分 量时,有下面三种情况:
若两个皇后摆放的位置分别是(i, xi)和(j, xj),在棋盘 上斜率为-1的斜线上,满足条件i-j= xj-xi ,在棋盘上斜 率为1的斜线上,满足条件i-j= xi-xj,综合两种情况, 由于两个皇后不能位于同一斜线上,所以,解向量X必须 满足约束条件: |i- j |≠| xi -xj| (式8.2)
HHIT
算法8.5:n-皇后问题的解
Algorithm
Procedure NQUEENS(n) //此过程使用回溯法求出一个n*n棋盘上放置n个皇后,使其不能互相攻 击的所有可能位置// integer k,n,X(1:n) X(1)0 ; k1 // k是当前行;X(k)是当前列 // while k>0 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 kk+1;X(k)0 //否则转到下一行// end if else kk-1 //回溯// end if repeat End NQUEENS
HHIT
Algorithm
算法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 i<k do if X(i)=X(k) or ABS(X(i)-X(k))=ABS(i-k) then return (false) end if ii+1 判断是否有其它的皇 repeat 后与之在同一列或同 一斜对角线上 return (true) End PLACE
HHIT
Algorithm
显然,棋盘的每一行上可以而且必须摆放一个皇后, 所以,n皇后问题的可能解用一个n元向量X=(x1, x2, …, xn) 表示,其中,1≤i≤n并且1≤xi≤n,即第i个皇后放在第i行第 xi列上。 由于两个皇后不能位于同一列上,所以,解向量X必 须满足约束条件: xi≠xj (式8.1)
HHIT
AlgBaidu Nhomakorabearithm
8.3.1 八皇后问题
八皇后问题是十九世纪著名的数学家高斯于 1850年提出的。问题是:在8×8的棋盘上摆放八 个皇后,使其不能互相攻击,即任意两个皇后都 不能处于同一行、同一列或同一斜线上。可以把 八皇后问题扩展到n皇后问题,即在n×n的棋盘 上摆放n个皇后,使任意两个皇后都不能处于同 一行、同一列或同一斜线上。
HHIT
Algorithm
(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);
HHIT
Algorithm 为了简化问题,下面讨论四皇后问题。 四皇后问题的解空间树是一个完全4叉树,树的根结 点表示搜索的初始状态,从根结点到第2层结点对应皇后1 在棋盘中第1行的可能摆放位置,从第2层结点到第3层结 点对应皇后2在棋盘中第2行的可能摆放位置,依此类推。
1 1 2 3 4 图8.11 四皇后问题 2 3 4 皇后1 皇后2 皇后3 皇后4
算法的实现
• 假设回溯法要找出所有的答案结点 。 • 设(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
HHIT
算法8.5——n皇后问题
Algorithm
HHIT
Algorithm
HHIT
Algorithm
回溯法求解4皇后问题的搜索过程
Q Q ×× Q Q ×× Q × ××× (c) Q ×××Q Q (g) (h) (i) Q Q ×Q (d) Q Q Q ××Q (j) (e) Q Q Q Q
(a) Q
(b) Q
Q ×Q × ×× ×
(f)
HHIT
Algorithm
Algorithm
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个分 量时,有下面三种情况:
若两个皇后摆放的位置分别是(i, xi)和(j, xj),在棋盘 上斜率为-1的斜线上,满足条件i-j= xj-xi ,在棋盘上斜 率为1的斜线上,满足条件i-j= xi-xj,综合两种情况, 由于两个皇后不能位于同一斜线上,所以,解向量X必须 满足约束条件: |i- j |≠| xi -xj| (式8.2)
HHIT
算法8.5:n-皇后问题的解
Algorithm
Procedure NQUEENS(n) //此过程使用回溯法求出一个n*n棋盘上放置n个皇后,使其不能互相攻 击的所有可能位置// integer k,n,X(1:n) X(1)0 ; k1 // k是当前行;X(k)是当前列 // while k>0 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 kk+1;X(k)0 //否则转到下一行// end if else kk-1 //回溯// end if repeat End NQUEENS
HHIT
Algorithm
算法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 i<k do if X(i)=X(k) or ABS(X(i)-X(k))=ABS(i-k) then return (false) end if ii+1 判断是否有其它的皇 repeat 后与之在同一列或同 一斜对角线上 return (true) End PLACE
HHIT
Algorithm
显然,棋盘的每一行上可以而且必须摆放一个皇后, 所以,n皇后问题的可能解用一个n元向量X=(x1, x2, …, xn) 表示,其中,1≤i≤n并且1≤xi≤n,即第i个皇后放在第i行第 xi列上。 由于两个皇后不能位于同一列上,所以,解向量X必 须满足约束条件: xi≠xj (式8.1)
HHIT
AlgBaidu Nhomakorabearithm
8.3.1 八皇后问题
八皇后问题是十九世纪著名的数学家高斯于 1850年提出的。问题是:在8×8的棋盘上摆放八 个皇后,使其不能互相攻击,即任意两个皇后都 不能处于同一行、同一列或同一斜线上。可以把 八皇后问题扩展到n皇后问题,即在n×n的棋盘 上摆放n个皇后,使任意两个皇后都不能处于同 一行、同一列或同一斜线上。
HHIT
Algorithm
(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);
HHIT
Algorithm 为了简化问题,下面讨论四皇后问题。 四皇后问题的解空间树是一个完全4叉树,树的根结 点表示搜索的初始状态,从根结点到第2层结点对应皇后1 在棋盘中第1行的可能摆放位置,从第2层结点到第3层结 点对应皇后2在棋盘中第2行的可能摆放位置,依此类推。
1 1 2 3 4 图8.11 四皇后问题 2 3 4 皇后1 皇后2 皇后3 皇后4
算法的实现
• 假设回溯法要找出所有的答案结点 。 • 设(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
HHIT
算法8.5——n皇后问题
Algorithm
HHIT
Algorithm
HHIT
Algorithm
回溯法求解4皇后问题的搜索过程
Q Q ×× Q Q ×× Q × ××× (c) Q ×××Q Q (g) (h) (i) Q Q ×Q (d) Q Q Q ××Q (j) (e) Q Q Q Q
(a) Q
(b) Q
Q ×Q × ×× ×
(f)
HHIT
Algorithm