深度优先搜索(pascal).ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《深度优先搜索(pascal).ppt》由会员分享,可在线阅读,更多相关《深度优先搜索(pascal).ppt(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、深度优先搜索深度优先搜索从问题的某一种可能出发从问题的某一种可能出发,搜索从这种情况出发所能达到搜索从这种情况出发所能达到的所有可能的所有可能,当这一条路走到当这一条路走到“尽头尽头”而没达到目的地的而没达到目的地的时候时候,再倒回再倒回上一个上一个出发点出发点,从另一个可能出发从另一个可能出发,继续搜索继续搜索.这种不断这种不断“倒回倒回 一步一步 寻找解的方法寻找解的方法,称作称作 回溯法回溯法.回溯即是较简单、较常用的搜索策略回溯即是较简单、较常用的搜索策略,实质就是一种搜索实质就是一种搜索策略策略.AB12345678910从从A到到B的路线的路线:A-4-6-B如如:找一条从找一条从
2、A到到B的路线的路线算法思想深度优先搜索的搜索策略是:尽可能“深”的搜索某一分支。在深度优先搜索中,对于最先发现的结点,如果还有以此为起点的未搜索边,则沿此边继续搜索下去。当结点V的所有边都已经被探寻过,搜索将回溯到发现点V的那条边的始结点。重复此过程直至源结点可到达的所有结点为止。深度优先搜索的基本算法结构(1)递归实现。Proceduredfs_try(i);Fori:=1tomaxrdobeginif子结点mr符合条件thenbegin产生的子结点mr入栈;if子结点mr是目标结点then输出;elsedfs_try(i+1);栈顶元素出栈;End;End;1.、问题描述问题描述 学校放
3、暑假时,信息学辅导教师有学校放暑假时,信息学辅导教师有n本书要分给参加培训的本书要分给参加培训的n个学生。如:个学生。如:A,B,C,D,E共共5本书要分给参加培训的张、刘、王、李、孙本书要分给参加培训的张、刘、王、李、孙5位学生,每人只能选位学生,每人只能选1本。教师事先让每个人将自己喜爱的书填写在如下的表中,然后根据他们填写的表本。教师事先让每个人将自己喜爱的书填写在如下的表中,然后根据他们填写的表来分配书本,希望设计一个程序帮助教师求出可能的分配方案,使每个学生都满意。来分配书本,希望设计一个程序帮助教师求出可能的分配方案,使每个学生都满意。输入格式:第一行一个数输入格式:第一行一个数n
4、(学生的个数,书的数量)(学生的个数,书的数量)以下共以下共n行,每行行,每行n个个0或或1(由空格隔开),第(由空格隔开),第I行数据表示第行数据表示第i个同学对个同学对所有书的喜爱情况。所有书的喜爱情况。0表示不喜欢该书,表示不喜欢该书,1表示喜欢该书。表示喜欢该书。输出格式:依次输出每个学生分到的书号。输出格式:依次输出每个学生分到的书号。样例:样例:输入:book.in50011011000011000001001001输出:book.out31245分析分析:a:array1.maxn,1.maxnof 0.1;b:array1.maxnof integer;方案方案:bi是第是第i
5、个人借第个人借第bi本书本书 book:array1.maxnof boolean;booki:能否可以借第能否可以借第i本书本书,初始初始:true,一旦有人借了一旦有人借了:就改为就改为:false算法设计算法设计:procedure try(i:integer);搜索第搜索第i个人可以借的书个人可以借的书bi var j:integer;begin if i=n+1 then 若书都借出,则若书都借出,则输出结果输出结果 else for j:=1 to n do if 第第i个人可以借第个人可以借第j 本书本书 then begin 记录下记录下bi;标记第标记第j本数已被借本数已被借
6、;try(i+1);删除书的被借标志删除书的被借标志;end;end;proceduretry(i:integer);varj:integer;beginifi=n+1thenprintelseforj:=1tondoifbookjand(ai,j=1)thenbeginbi:=j;bookj:=false;try(i+1);bookj:=true;bi:=0;end;end;procedureprint;vari:integer;beginfori:=1ton-1dowrite(bi,);writeln(BN);end;主程序主程序:beginfillchar(b,sizeof(b),0);
7、fillchar(book,sizeof(book),true);readln(n);fori:=1tondoforj:=1tondoread(ai,j);try(1);End.2.、骑士的游历、骑士的游历设有下图所示的一个棋盘,在棋盘上的设有下图所示的一个棋盘,在棋盘上的A点有一个中国象棋马,并约定点有一个中国象棋马,并约定马走的规则:马走的规则:1、马只向右走;2、马走“日“字。找出所有从找出所有从A到到B的路径。的路径。一种方法:一种方法:(2 1)(4 0)(5 2)(6 0)(7 2)(8 4)1112345671231分析:分析:1、马跳的方向:马跳的方向:x:array1.4,1
8、.2of integer=(1,-2),(2,-1),(2,1),(1,2);4个方向横向和纵向的增量。个方向横向和纵向的增量。2、记录马经过的位置坐标、记录马经过的位置坐标 a:array0.8,1.2of integer;第第i步所在的位置,步所在的位置,1:横坐标:横坐标 2:纵坐标:纵坐标递归算法:递归算法:procedure try(i:integer);搜索第搜索第i步步:try(1);var j:integer;begin for j:=1 to 4 do if(ai-1,1+xj,1=0)and(ai-1,1+xj,1=0)and(ai-1,2+xj,2(2,1)-(3,1)-
9、(2,2)-(3,3)-(4,3)-(5,2)-(6,3)-(7,3)-(8,2)-(8,1)分析分析:a:array1.maxn,1.maxnof 0.1;记录迷宫坐标记录迷宫坐标 c:array1.maxn,1.maxnof 0.1;访问标志访问标志:0:没走没走;1:已走已走 b:array0.maxn*maxn of integer;记录路径方向记录路径方向 dx,dy:array1.8of integer;方向位移方向位移 8个方向的位移个方向的位移:dx1:=0;dy1:=-1;dx2:=1;dy2:=-1;dx3:=1;dy3:=0;dx4:=1;dy4:=1;dx5:=0;dy
10、5:=1;dx6:=-1;dy6:=1;dx7:=-1;dy7:=0;dx8:=-1;dy8:=-1;读入数据读入数据:坐标坐标procedurereaddata;beginassign(input,a.in);reset(input);readln(n);fori:=1tondoforj:=1tondobeginread(aj,i);i:纵坐标;j:横坐标cj,i:=0;end;close(input);递归算法递归算法:procedure try(i:integer);搜索第搜索第i步应到达的位置步应到达的位置 var k:integer;begin for k:=1 to 8 do be
11、gin if(x+dxk=1)and(x+dxk=1)and(y+dyk,(,x,y,);end;writeln;end;主程序主程序:begin readdata;x:=1;y:=1;try(1);end.4、覆盖问题。、覆盖问题。(li1.txt)边长为N(偶数)的正方形,用N*N/2个长为2宽为1的长方形将它全部覆盖。编程打印所有覆盖方法。当N=4时几种覆盖方法的打印格式举例如下:输出:12241122133433445668556657787788输入:4分析分析:把边长为把边长为n的正方形划分为的正方形划分为n*n个边长为个边长为1的格子的格子,用数组用数组a描述覆盖情况:描述覆盖情
12、况:aI,j:格子还没被覆盖,否则被编号为:格子还没被覆盖,否则被编号为aI,j的的格子覆盖格子覆盖算法描述:算法描述:、先行后列的原则找到一个、先行后列的原则找到一个aI,j,即未被覆盖的格子(,即未被覆盖的格子(i,j)。)。、如果行号、如果行号(in)and(ai+1,j=0),即正下方的格子未覆盖即正下方的格子未覆盖,那么格子那么格子(I,j)和和(i+1,j)用同一个用同一个1*2的格子覆盖的格子覆盖.转向转向 3.如果列号如果列号(jn)and(ai,j=0),即右邻的格子未覆盖即右邻的格子未覆盖,那么格子那么格子(I,j)和和(i,j)用同一个用同一个1*2的格子覆盖的格子覆盖.
13、转向转向 3、如果现在已用完了、如果现在已用完了nn长方形,则转向,否则执行长方形,则转向,否则执行、打印现有的覆盖方案,得到一种覆盖方法。、打印现有的覆盖方案,得到一种覆盖方法。proceduretry(i:integer);搜索用编号i的长方形覆盖的格子:给格子编号varj,k:integer;beginj:=0;列初始化repeat找aj,k的格子j:=j+1;k:=1;while(k0)doinc(k);until(k=n);aj,k:=i;格子(j,k)用编号i覆盖if(jn)and(aj+1,k=0)then正下方格子未覆盖,用i覆盖beginaj+1,k:=i;ifi*2n*nt
14、hen最大编号为n*n/2try(i+1)elseprint;aj+1,k:=0;回溯end;if(kn)and(aj,k+1=0)then右方方格子未覆盖,用i覆盖beginaj,k+1:=i;ifi*2n*nthentry(i+1)elseprint;aj,k+1:=0;回溯end;aj,k:=0;回溯end;procedureprint;vari,j:integer;beginwriteln;inc(t);fori:=1tondobeginforj:=1tondowrite(ai,j);writeln;end;end;主程序主程序:beginreadln(n);ifodd(n)or(n0
15、)thenwriteln(Error!)elsetry(1);end.5、黑白棋子、黑白棋子 现有现有N个黑棋和个黑棋和N个白棋,将这个白棋,将这2N各棋子放入一个各棋子放入一个N*N棋盘,使每行每列都有一个黑棋和一个白棋。求满足棋盘,使每行每列都有一个黑棋和一个白棋。求满足上述要求的布棋方案有多少种。上述要求的布棋方案有多少种。N=2时,有以下两种放置方法:时,有以下两种放置方法:输出:const max=10;type bhxing=array1.maxof shortint;var b:array1.max,1.maxof boolean;棋盘能否可用棋盘能否可用 bai:array1.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深度 优先 搜索 pascal
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内