高中信息技术 全国青少年奥林匹克联赛教案 搜索法一.doc

高中信息技术 全国青少年奥林匹克联赛教案 搜索法一.doc

ID:56664341

大小:80.50 KB

页数:4页

时间:2020-07-02

高中信息技术 全国青少年奥林匹克联赛教案 搜索法一.doc_第1页
高中信息技术 全国青少年奥林匹克联赛教案 搜索法一.doc_第2页
高中信息技术 全国青少年奥林匹克联赛教案 搜索法一.doc_第3页
高中信息技术 全国青少年奥林匹克联赛教案 搜索法一.doc_第4页
资源描述:

《高中信息技术 全国青少年奥林匹克联赛教案 搜索法一.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、算法在信息学奥赛中的应用(搜索法一)在这里介绍两种基本的搜索算法:深度优先搜索和广度优先搜索法,以树的搜索为例,深度优先搜索法是优先扩展尚未扩展的且具有最大深度的结点;广度优先搜索法是在扩展完第K层的结点以后才扩展K+1层的结点。深度优先搜索法与前面讲的回溯法差不多,主要的区别是回溯法在求解过程中不保留完整的树结构,而深度优先搜索则记下完整的搜索树,搜索树起记录解路径和状态判重的作用。为了减少存储空间,在深度优先搜索中,用标志的方法记录访问过的状态,这种处理方法使得深度优先搜索法与回溯法没什么区别了。在回溯法中,我们己分析了非递归的

2、实现过程,在这里就只讨论深度优先的递归实现方法。深度优先搜索的递归实现过程:proceduredfs(i);fori:=1tordoif子结点mr符合条件then产生的子结点mr入栈;if子结点mr是目标结点then输出elsedfs(i+1);栈顶元素出栈(即删去mr);endif;endfor;在讲解递推法时,我们讨论了用递推法解骑土游历问题,在这里我们再看看如何用深度优先搜索法求解此题。搜索算法应用例1骑士游历:设有一个n*m的棋盘,在棋盘上任一点有一个中国象棋马,马走的规则为:1.马走日字2.马只能向右走。当N,M输入之后,

3、找出一条从左下角到右上角的路径。例如:输入N=4,M=4,输出:路径的格式:(1,1)->(2,3)->(4,4),若不存在路径,则输出"no"算法分析:我们以4×4的棋盘为例进行分析,用树形结构表示马走的所有过程(如下图),求从起点到终点的路径,实际上就是从根结点开始深度优先搜索这棵树。马从(1,1)开始,按深度优先搜索法,走一步到达(2,3),判断是否到达终点,若没有,则继续往前走,再走一步到达(4,4),然后判断是否到达终点,若到达则退出,搜索过程结束。为了减少搜索次数,在马走的过程中,判断下一步所走的位置是否在棋盘上,如果不

4、在棋盘上,则另选一条路径再走。程序如下:constdx:array[1..4]ofinteger=(2,2,1,1);dy:array[1..4]ofinteger=(1,-1,2,-2);typemap=recordx,y:integer;end;vari,n,m:integer;a:array[0..50]ofmap;proceduredfs(i:integer);varj:integer;beginforj:=1to4doif(a[i-1].x+dx[j]>0)and(a[i-1].x+dx[j]<=n)and(a[i-1].

5、y+dy[j]>0)and(a[i-1].y+dy[j]<=n)then{判断是否在棋盘上}begina[i].x:=a[i-1].x+dx[j];a[i].y:=a[i-1].y+dy[j];{入栈}if(a[i].x=n)and(a[i].y=m)thenbeginwrite('(',1,',',1,')');forj:=2toidowrite('->(',a[j].x,',',a[j].y,')');halt;{输出结果并退出程序}end;dfs(i+1);{搜索下一步}a[i].x:=0;a[i].y:=0;{出栈}end;

6、end;begina[1].x:=1;a[1].y:=1;readln(n,m);dfs(2);writeln('no');end.从上面的例子我们可以看出,深度优先搜索算法有两个特点:1、己产生的结点按深度排序,深度大的结点先得到扩展,即先产生它的子结点。2、深度大的结点是后产生的,但先得到扩展,即“后产生先扩展”,与栈的工作原理相同,因此用堆栈作为该算法的主要数据结构,存储产生的结点。对于不同的问题,深度优先搜索算法基本上是一样的,但在具体处理方法和编程技巧上又都不相同,甚至会有很大的差别。我们再看看另一个例子。题二选数(存盘名

7、:NOIP2002pj)[问题描述]:已知n个整数x1,x2,…,xn,以及一个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。现在,要求你计算出和为素数共有多少种。例如上例,只有一种的和为素数:3+7+19=29。[输入]:键盘输入,格式为:  n,k(1<=n<=20,k<n)  x1,x2,…,xn(1<=xi<=)[输出]:屏幕输

8、出,格式为:  一个整数(满足条件的种数)。[输入输出样例]:输入:43 371219输出:1算法分析:本题是求从n个数中选k个数的组合,并使其和为素数。求解此题时,先用深度优先搜索法生成k个数的组合,再判断k个数的和是否为素数,若为

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。