云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 八皇后问题与背包问题

八皇后问题与背包问题

  • 62 次阅读
  • 3 次下载
  • 2025/12/12 5:00:34

皇后问题。在一个国际象棋棋盘上,放置8个皇后,使她们相互之间不能进攻(只要在一条直线上就不可,即在每一横列竖列斜列只有一个皇后)。求出所有布局。 program eight; var a:array [1..8] of integer; b,c,d:array [-7..16] of integer; t,i,j,k:integer; procedure print; begin t:=t+1; write(t,' '); for k:=1 to 8 do write(a[k],' '); writeln; end; procedure try(i:integer); var j:integer; begin for j:=1 to 8 do {每个皇后都有8种可能位置} if (b[j]=0) and (c[i+j]=0) and (d[i-j]=0) then {判断位置是否冲突} begin a[i]:=j; {摆放皇后} b[j]:=1; {宣布占领第J行} c[i+j]:=1; {占领两个对角线} d[i-j]:=1; if i<8 then try(i+1) {8个皇后没有摆完,递归摆放下一皇后} else print; {完成任务,打印结果} b[j]:=0; {回溯} c[i+j]:=0; d[i-j]:=0; end; end; begin for k:=-7 to 16 do {数据初始化} begin b[k]:=0; c[k]:=0; d[k]:=0; end; try(1);{从第1个皇后开始放置} end. 这是深搜的内容 搜索资料: 搜 索 算 法 搜索算法是利用计算机的高性能来有目的的穷举一个问题的部分或所有的可能情况,从而求出问题的解 的一种方法。搜索过程实际上是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的节点的过程。 所有的搜索算法从其最终的算法实现上来看,都可以划分成两个部分——控制结构和产生系统,而所有的算 法的优化和改进主要都是通过修改其控制结构来完成的。现在主要对其控制结构进行讨论,因此对其产生系 统作如下约定: Function ExpendNode(Situation:Tsituation;ExpendWayNo:Integer):TSituation; 表示对给出的节点状态Sitution采用第ExpendWayNo种扩展规则进行扩展,并且返回扩展后的状态。 (本文所采用的算法描述语言为类Pascal。) 第一部分 基本搜索算法 一、回溯算法 回溯算法是所有搜索算法中最为基本的一种算法,其采用了一种“走不通就掉头”思想作为其控制结构, 其相当于采用了先根遍历的方法来构造解答树,可用于找解或所有解以及最优解。具体的算法描述如下: [非递归算法] Node(节点类型)=Record Situtation:TSituation(当前节点状态); Way-NO:Integer(已使用过的扩展规则的数目); End List(回溯表):Array[1..Max(最大深度)] of Node; pos(当前扩展节点编号):Integer; List<-0; pos<-1; List[1].Situation<-初始状态;

While (pos>0(有路可走)) and ([未达到目标]) do Begin If pos>=Max then (数据溢出,跳出主程序); List[pos].Way-NO:=List[pos].Way-No+1; If (List[pos].Way-NO<=TotalExpendMethod) then (如果还有没用过的扩展规则) Begin If (可以使用当前扩展规则) then Begin (用第way条规则扩展当前节点) List[pos+1].Situation:=ExpendNode(List[pos].Situation, List[pos].Way-NO); List[pos+1].Way-NO:=0; pos:=pos+1; End-If; End-If Else Begin pos:=pos-1; End-Else End-While; [递归算法] Procedure BackTrack(Situation:TSituation;deepth:Integer); Var I :Integer; Begin If deepth>Max then (空间达到极限,跳出本过程); If Situation=Target then (找到目标); For I:=1 to TotalExpendMethod do Begin BackTrack(ExpendNode(Situation,I),deepth+1); End-For; End; 范例:一个M*M的棋盘上某一点上有一个马,要求寻找一条从这一点出发不重复的跳完棋盘上所有的点的路线。 评价:回溯算法对空间的消耗较少,当其与分枝定界法一起使用时,对于所求解在解答树中层次较深的问题 有较好的效果。但应避免在后继节点可能与前继节点相同的问题中使用,以免产生循环。 二、深度搜索与广度搜索 深度搜索与广度搜索的控制结构和产生系统很相似,唯一的区别在于对扩展节点选取上。由于其保留了 所有的前继节点,所以在产生后继节点时可以去掉一部分重复的节点,从而提高了搜索效率。这两种算法每 次都扩展一个节点的所有子节点,而不同的是,深度搜索下一次扩展的是本次扩展出来的子节点中的一个, 而广度搜索扩展的则是本次扩展的节点的兄弟节点。在具体实现上为了提高效率,所以采用了不同的数据结构. [广度搜索] Node(节点类型)=Record Situtation:TSituation(当前节点状态); Level:Integer(当前节点深度); Last :Integer(父节点); End List(节点表):Array[1..Max(最多节点数)] of Node(节点类型); open(总节点数):Integer; close(待扩展节点编号):Integer; New-S:TSituation;(新节点) List<-0; open<-1; close<-0; List[1].Situation<- 初始状态; List[1].Level:=1; List[1].Last:=0;
While (close Open:Array[1..Max] of Node;(待扩展节点表) Close:Array[1..Max] of Node;(已扩展节点表) openL,closeL:Integer;(表的长度) New-S:Tsituation;(新状态) Open<-0; Close<-0; OpenL<-1;CloseL<-0; Open[1].Situation<- 初始状态; Open[1].Level<-1; Open[1].Last<-0;
While (openL>0) and (closeL
搜索更多关于: 八皇后问题与背包问题 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

皇后问题。在一个国际象棋棋盘上,放置8个皇后,使她们相互之间不能进攻(只要在一条直线上就不可,即在每一横列竖列斜列只有一个皇后)。求出所有布局。 program eight; var a:array [1..8] of integer; b,c,d:array [-7..16] of integer; t,i,j,k:integer; procedure print; begin t:=t+1; write(t,' '); for k:=1 to 8 do write(a[k],' '); writeln; end; procedure try(i:integer); var j:integer; begin for j:=1 to 8 do {每个皇后都有8种可能位置} if (b[j]=0) and (c[i+j]=0) and (d[i-j]=

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com