图的遍历和搜索

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

一. 递归算法: 递归过程为: procedure TRY(i); For r:=1 to maxr do (maxr是产生式规则数) begin If 子结点MR 符合条件 THEN begin 产生的子结点MR压入栈; IF 子结点 MR是目标结点 THEN 输出 是目标结点 ELSE TRY(I+1); ( ) 栈顶元素出栈(删去MR); end; end; {**********main**********} program DFS; 初始栈; TRY(1);
填数字 有如图所示的九个小方 格,在每个方格中填入0-9 中的一个数字,每个数字只 能用一次,并使每行的数字 组成的自然数都是完全平方 数,如图的填法就是一种合 法的情况.试编程找出所有 正确的填法. 输出要求:每行输出四 个自然数(分别为一位数, 二位数,三位数,四位数), 表示一种填法,两数之间用 空格分隔.例如上图情况输 出:1 36 784 9025.
Pass 检验第2组- - 第K组 数是否合格,如合格则 输出 其中bb是b的拷贝
将Z[1]—Z[m]中数字计算出值赋给E i 2 to k g E*i j M downto 1 h g Y g mod 10 g div 10 bb[h]>0 exit N
bb[h]:=bb[h]-1 If g>0 then exit
AC ACE ACED ACEDC
ACDE ACDEC
ABCDE
ABCDEC
ABCDEC
ACDECB
ACEDCB
ABCDECA ABCDECA
ACDECBA
ACEDCBA
var f:text; data:array['A'..'Z','A'..'Z'] of integer; s:string; n,m:integer; ans:boolean;
深度优先搜索算法
深度优先搜索算法
深度优先搜索法有两大基本特点: 1. 对已产生的结点按深度排序,深度大的先得到扩展, 即先产生它的子结点; 2. 深度大的结点是后产生的,但先得到扩展,即"后 产生先扩展".因此用堆栈作为该算法的主要数据结构, 存储产生的结点,先把产生的数入栈,产生栈顶(即深 度最大的元素)子结点,子结点产生以后,出栈,再产 生栈顶子结点.
产生式系统由3个基本要素组成:一个综合数据库(Globle database), 一组产生式规则(Sett Of rules)和一个控制系统(Control System). 1.综合数据库 它是产生式系统所用的主要数据结构.它主要表示问题的状态,即初始 状态,目标状态和中间状态,以及状态之间的关系等.它不是固定不变的, 在求解过程中,它的内容将越来越多,状态之间的关系也越来越复杂. 经常用来表示数据库的数据结构有串,集合,数组,树,表,记录,队 列等. 2.产生式规则 是对数据库进行操作的一系列规则.规则的一般形式是: IF 条件 THEN 操作即满足应用的先决条件后,就对数据库实行后面的 操作. 3.控制策略 它规定了操作的顺序,即在什么条件下用什么规则进行操作,什么条件 下停止运行,即它规定了问题求解的搜索策略和路线
输出结果到OUTPUT Have:=false
骑士游历问题:在6*6的国际象棋上的某 一位置上放置一"马",然后采用象棋 中"马走日字"的规则,要求该"马" 能不重复地走完36个格子,试编写程序 解决这个问题.
3 4
X,Y
2 1 8
5 6 7
数组A
-1 2
-2 1
-2 -1
-1 -2
1 -2
2 -1
procedure main(ch:char;step:integer); var r:char; begin for r:='A' to chr(64+n) do begin if data[ch,r]=1 then begin data[ch,r]:=0;data[r,ch]:=0;s:=s+r; if length(s)-1=m then print else main(r,step+1); data[ch,r]:=1;data[r,ch]:=1;delete(s,length(s),1); end; end; end;
1 3 7 9 0 8 2 6 4 5
For I:=1 to 3 For j:=4 to 9 For k:=11 to 31 For p:=32 to 99
求I*i ,分离各位数字 求j*j ,分离各位数字 求k*k, 分离各位数字 求p*p , 分离各位数字
数据初始化
have Made(1)
true
Y
have
N
输出无解信息
Made(t) 填写第t个数 前提: 前t-1个数是合法 的 t<n
iFra Baidu bibliotek
1 to n b[t]:=i Pass1(I,t) and YN(a[t-1]+b[t]) Y a[t]:=i t<n Y N N
Made(t+1)
Pass2(t)
A
1 2 3 4
1
2
3
4 P5
5
6 P4
7
8
Y
P6 马 P7 P8 P1
P3
P2 B(4,8)
X
现有n个数字(n<=200),要求把这n个数字划分 成K(K能整除N,设M=N/K)个集合S1, S2, S3 … Sk,,每个集合均有M个数字,集合Si中 的数字按某种次序串接,构成一个正整数Li L (i=1,2,3, … ,k),问怎样划分和排列集合S1, S2, S3 … Sk,,使得L1:L2 :L3 : … :Lk=,1: 2:3: …:k.
2 1
1 2
设置8个方向变化 初始化board Board[1,1] try(1,1,2,q) q 1
Y
N
输出结果
输出无解信息
K Try(x,y,i,q)
表示对(x,y)位置 作为第i步向前试探 的过程.若试探成 功,逻辑变量q的值 为true,否则为false
0 k←k+1 q1←false u←x+a[1,k] v←y+a[2,k] 合格 Y N Board=0 N Y Board[u,v] ←i i<n*n N
其中回溯过程如下: procedure backtracking; dep:=dep-1; if dep>0 then 取回栈顶元素 else p:=true;
Dep:=0 Dep:=dep+1 j:=0;p:=false; j:=j+1;
Y Mr符合条件 Y J>=maxj N N
产生子节点MR并记录
Y 子节点是目标 N
回溯
P:=false
输出并出栈
P:=true
Until p=false Until dep=0
如图:A点有一个过河卒,需要走到目标B点.卒行走 的规则:可以向下,或者向右.同时在棋盘上的任一 点有一个对方的马(如图的C点),该马所在的点和 所有串跳跃一步可达的点称为对方马的控制点.例如 图中C点上的马可以控制9个点(图中的P1,P2,…, P8和C).卒不能通过对方马的控制点. 棋盘用坐标表示,A点(0,0),B点(n,m)(n,m 为不超过20的整数,并由键盘输入),同样马的位置 坐标是需要给出的(约定:C<>A,同时C<>B).现在 要求你计算出卒从A点能够到达B点的路径的条数.
1
Dfs: 124563
2 3
Bfs: 123465
4
6
5
1
2
Dfs: 124563
4
5
6
3
1
Bfs: 123465
3
2
4
6
5
1
Dfs: 124356
2 3
Bfs: 123645
4
5
6
1
Dfs: 124356
2 3
4
5
6
1
Bfs: 123645
2 3 6
4
5
A
B
C
D
E
A
B C
A
D
E
AB ABC ABCD ABCDE ABCE ACD
B[I] n个数据 Input.txt K值 have Made(1) have true
Y
N
输出无解信息
Made(s) 取第1组的第S个数
i
0 to 9 B[i]>0 Y N i
前提: 前S-1个数是合法 的 S<M
Z[s] B[I]:=B[I]-1 S<M Y
N
Made(s+1)
pass
B[I]:=B[I]+1
INPUT.TXT 123456789 3 OUTPUT.TXT 192 384 576 219 438 657 273 546 819 327 654 981
用数组B[0..9]来存储N个数字 存储规则: B[0]存储N个数字中0的个数 B[1]存储N个数字中1的个数 B[2]存储N个数字中2的个数 ………… ………… B[8]存储N个数字中8的个数 B[9]存储N个数字中9的个数
Try(I)
For r:=1 to maxr do
子结点mr符合条件 Y
N
产生的子结点mr入栈
子结点mr是目标结点
Y
N
输出
Try(I+1)
栈顶元素出栈(删去mr)
二. 非递归算法 program DFS(dep); dep:=0; repeat dep:=dep+1;j:=0;p:=false; repeat j:=j+1; if 子结点mr符合条件 then 产生子结点mr并将其记录 if 子结点是目标 then 输出并出栈(更新j) else p:=true; else if j>maxj then 回溯 else p:=false; until p=true; until dep=0;
begin init; main('A',1); if ans then writeln(f,'NO'); close(f); end.
procedure init; var i:integer;ch1,ch2,ch3:char; begin for ch1:='A' to 'Z' do for ch2:='A' to 'Z' do data[ch1,ch2]:=0;s:='A';ans:=true; assign(f,'wjx.in');reset(f);readln(f,n,m); for i:=1 to m do begin readln(f,ch1,ch2,ch3); data[ch1,ch3]:=1; data[ch3,ch1]:=1; end; close(f);assign(f,'wjx.out');rewrite(f); end;
Y Try(u,v,i+1,q1) Q1:=true Not (q1) N Y Board[u,v]:=0 Q1 OR (K=8) Q:=Q1
试编程将1至N(N≤10)的自然数序列1,2,…, N重新排列,使任意相邻两数之和为素数.例如N =3时有两种排列方案123,321满足要求. 输入要求:N从键盘输入. 输出要求:每行输出一种排列方案(相邻数字之间 用空格分隔). 最后一行输出排列方案总数. 例如输入 3 输出 1 2 3 3 2 1 2
图的遍历和搜索算法
搜索算法: 搜索算法 利用计算机的高性能来有目的 的穷举一个问题的部分或所有的可 能情况, 能情况,从而求出问题的解的一种 方法. 方法. 搜索过程实际上是根据初始条 件和扩展规则构造一棵解答树并寻 找符合目标状态的节点的过程. 找符合目标状态的节点的过程.
深度优先与广度优先
深度优先的特点是在每 一个多岔路口, 一个多岔路口,如果能找 到一条路往下走,就走, 到一条路往下走,就走, 而不管别的路是否也能 走下去,直到到达终点 或无路可走时回溯.所 以利用深度优先搜索, 只要有路,总能找到, 但找到的那条并不一定 是最优的. 广度优先的特点是在 每一个多岔路口,都 要把所有的路都尝试 一下,直到到达终点. 所以利用广度优先搜 索,只要有路,也总 能找到,而且一旦找 到,一定是最优解 (也即最少步骤).
procedure print; begin writeln(f,s);ans:=false; end;
procedure print; begin writeln(f,s);ans:=false; end;
深度优先与广度优先
深度优先的特点是在每 广度优先的特点是在 一个多岔路口,如果能找 每一个多岔路口,都 到一条路往下走,就走,而 要把所有的路都尝试 不管别的路是否也能走 一下,直到到达终点. 下去,直到到达终点或 所以利用广度优先搜 无路可走时回溯.所以 索,只要有路,也总 利用深度优先搜索,只 能找到,而且一旦找 要有路,总能找到,但 到,一定是最优解 (也即最少步骤). 找到的那条并不一定是 最优的.
相关文档
最新文档