搜索算法.ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例题二逻辑判断题
四个学生上地理课,回答我国四大淡水湖大小时这样说 甲:最大洞庭湖,最小洪泽湖,鄱阳湖第3 乙:最大洪泽湖,最小洞庭湖,鄱阳湖第2。太湖第3 丙:最小洪泽湖,洞庭湖第3 丁:最大鄱阳湖,最小太湖,洪泽湖第2。洞庭湖第3 对于各个源泊应处的地位,每个人只说对了一个。 根据以上情况,编一程序,让计算机判断各个湖泊应处于第几 位。
深度优先搜索
深度优先搜索所遵循的搜索策略是尽可能“深”地搜索图。 在深度优先搜索中,对于最新发现的结点,如果它还有以此 为结点而未搜索的边,就沿此边继续搜索下去,当结点V的 所有边都已被搜索过,搜索将回朔到发现结点V有那条边的 始结点。这一过程一直进行到已发现从源结点可达的所有结 点为止。如果还存在未被发现的结点,则选择其中一个作为 源结点并重复以上过程,整个过程反复进行直到所有结点都 被发现为止。
End;
例题一 N的全排列
输入N,输出1,2,…n的全排列(n<=8) 如:n=3 1,2,3; 1,3,2; 3,2,1; 3,1,2; 2,1,3; 2,3,1共有六种排列方式
输出全排列是一经典搜索问题,关键在于:数字不 能重复出现,所以用一个数组记录每个数字是否出 现过,每确定一个数字,就把这个数标为已出现过, 但回溯时,必须把这个数字复原为没出现过
数据结构: 1、设A[]数组为N个空盒可以放N个数,一开始A[]全部 为0即都可以放 2、设X[]数组是每一次的排列,即X的长度为N 3、TOTAL为累记总数
源程序如下:
program qp; var i,n,total:integer; x,a:array[1..9]of integer; procedure print;{该过程用来打印输出一次排列} var i:integer; begin for i:=1 to n do write(x[i]:3); writeln; total:=total+1;{每打印一次累加一次} end;
prwenku.baidu.comcedure try(i:integer);{从第一个开始试着放}
• 穷举法 • 深度优先搜索 • 广度优先搜索
穷举法
穷举法也叫枚举法,是指在一个有穷的可能的解的集合中, 枚举出集合中的每一个元素,用题目给定的约束条件去判 断其是否符合条件,若满足条件,则该元素即为整个问题 的解;否则就不是问题的解。枚举的思想往往是最容易想 到的一种解题策略,枚举法从本质上说是一种搜索的算法, 但适用枚举法解题必须满足下列条件:
搜索算法
胡苗坤
常见搜索算法
在信息学奥赛中,有的试题能在有限的时间内,用简明的数 学模型揭示问题本质;对于这一类试题,我们尽量用解析法 求解。但也有些试题,对给定的问题建立数学模型,或即使 有一定的数学模型,但采用数学方法解决有一定的困难,对 于这一类试题,我们只好用模拟或搜索求解。常见的搜索算 法有以下几种:
算法分析:
本题是一个逻辑判断题,一般的逻辑判断题都采用枚举法进行 解决。四个湖的大小分别可以有4!=24种排列可能,因为24比 较小,因此我们对每种情况进行枚举,然后根据给定的条件判 断哪些符合问题的要求。
数据结构:
1、设四个湖分别为,D(洞庭湖),H(洪泽湖)B(鄱阳 湖),T(太湖)。
2、四个人每人说一句话,且话中有一句是对的,所以让D,H, B分别从一变化到四(T=10-D-H-B);然后分别对四句话分别 进行判断,如果在三重循环中能够判断出四句话一句是对的, 则输出一组解。可以利用ORD()序号函数来实现ORD(true) =1,ord(false)=0;下面就是对甲同学的判断:
for h:=1 to 4 do begin If h<>d then for b:=1 to 4 do
begin If ((b<>d))and (b<>d)) then Begin t:=10-d-h-b; if ord(d=1)+ord(h=4)+ord(b=3)=1 then begin if ord(h=1)+ord(d=4)+ord(b=2)+ord(t=3)=1 then if ord(h=4)+ord(d=3)=1 then if ord(b=1)+ord(t=4)+ord(h=2)+ord(d=3)=1 then begin writeln(‘d=‘,d);writeln(‘h=‘,h);writeln(‘b=’,b); writeln(‘t=’,t); end; End else writeln(‘false’); end; end; End.
bl:=true; for m:2 to n-1 do {用2到n-1之间的整数逐一去除n} if n mod n=0 then {若其中有一个数能够整除n}
bl:=false; if bl then {若2到n-1之间没有数能够整除n}
write(n:5); {则n是素数,输出n} end; end.
1、可预见确定解元素的个数n,且问题的规模不是特别大;
2、对于每个解变量a1,a2,…an的可能值必须为一个连续的 值域。
例题一找出100以内的所有素数
program p11;{此题太简单不再详述} var n,m:integer; bl:boolean;{指示n是否为素数} begin for n:2 to 100 do {可能解的范围是2到100之间的整数} begin
深度优先搜索基本算法
递归算法: Procedure dfs-try(i); For I:=1 to maxr do Begin
if 子结点mr符合条件 then begin 产生子结点mr入栈; if 子结点mr是目标结点 then 输出 else dfs-try(I+1); 栈顶元素出栈; end;
Ord(d=1)+ord(h=4)+ord(b=3)=1因为一句话是对的所以肯定有一 个序号是1,只要对四位同学的话进行分别判断都成立就得到 了准确的解。当然,也可以用布尔类型来完成同样的工作。
源程序:
Var k,d,h,b,t:integer; Begin K:=0; For d:=1 to 4 do