深度优先搜索ppt课件.ppt
《深度优先搜索ppt课件.ppt》由会员分享,可在线阅读,更多相关《深度优先搜索ppt课件.ppt(135页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物栈与递归我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物例0-1:输入一个正整数n,求n的阶乘var n : integer;function fac(n:integer):longint;begin if n = 0 then fac := 1 else fac := n * fac(n-1);end;begin readln(n); writeln(fac(n);end
2、.我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物要理解递归,首先应了解一种数据结构:堆要理解递归,首先应了解一种数据结构:堆栈(简称栈)的概念。栈(简称栈)的概念。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物栈(栈(stack)又名堆栈,它是一种运算受限的线性表。)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一其限制是仅允许在表的一端进行插入和删除运算。这一端称为栈顶,相对地,
3、把另一端称为栈底。向一个栈插端称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素称作进栈、入栈或压栈;从一个栈删除元素又入新元素称作进栈、入栈或压栈;从一个栈删除元素又称作出栈或退栈。称作出栈或退栈。 我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物栈指针top123Init初始化栈初始化栈Procedure init;Begin top := 0;End;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物栈指针top
4、123Push入栈入栈Procedure push(x:integer);Begin top := top + 1; if isfull = false then Stacktop := x; else writeln(stack full);End;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物栈指针top123Isfull判栈满判栈满Function isfull;Begin if top = n + 1 then; isfull := true; else isfull := false;End;n
5、 + 1我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物栈指针top123Gettop取栈顶元素取栈顶元素Function gettop:integerBegin gettop : = stacktop;End;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物栈指针top123Push出栈出栈Procedure pop;Begin if isempty = true then write(stack empty) els
6、e top : = top 1;End;栈空栈空我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物栈指针top123Isempty判栈空判栈空Function isempty;Begin if top = 0 then; isempty := true; else isempty := false;End;0我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物例0-2:输入n个整数,并逆序输出(栈实现)。输入样例:31 2 3
7、输出样例:3 2 1我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物const maxn = 20;var stack : array1.maxn of integer; top : integer; n, i, x : integer;procedure init;begin top := 0;end;function isfull:boolean;begin if top = n + 1 then isfull := true else isfull := false;end;我吓了一跳,蝎子是多么丑恶
8、和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物function isempty:boolean;begin if top = 0 then isempty := true else isempty := false;end;procedure push(x:integer);begin top := top + 1; if isfull = true then writeln(Stack Full) else stacktop := x;1.end;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是
9、我也感到愉快,证实我的猜测没有错:表里边有一个活的生物function gettop:integer;begin gettop := stacktop;end;procedure pop;begin if isempty = true then writeln(Stack Empty) else top := top - 1;1.end;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物begin readln(n); for i := 1 to n do begin read(x); push(x); en
10、d; while isempty true do begin write(gettop, ); pop; end;1.end.我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物编译器处理函数调用时,就是使用栈来保存数据的。当主调函编译器处理函数调用时,就是使用栈来保存数据的。当主调函数调用另一个函数时,编译器将主调函数的所有实参和返回地数调用另一个函数时,编译器将主调函数的所有实参和返回地址压入到栈中,栈指针将移到合适的位置来容纳这些数据。址压入到栈中,栈指针将移到合适的位置来容纳这些数据。Function
11、函数1:integer;Begin 函数2;End;函数函数1调用函数调用函数2系统栈中的变化(入栈)系统栈中的变化(入栈)我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物当进行被调函数时,编译器将栈中的实参数据弹出,赋值给函当进行被调函数时,编译器将栈中的实参数据弹出,赋值给函数的形参。在被调用函数执行期间,还可利用栈来保存函数执数的形参。在被调用函数执行期间,还可利用栈来保存函数执行时的局部变量。当被调用函数准备返回时,系统将弹出栈中行时的局部变量。当被调用函数准备返回时,系统将弹出栈中所有当前函数压入
12、栈中的值,这时,栈指针移动到被调用函数所有当前函数压入栈中的值,这时,栈指针移动到被调用函数刚开始执行时的位置。接着被调用函数返回,系统从栈中弹出刚开始执行时的位置。接着被调用函数返回,系统从栈中弹出返回地址,主调函数就可以继续执行了。返回地址,主调函数就可以继续执行了。函数函数2返回至函数返回至函数1系统栈中的变化(出栈)系统栈中的变化(出栈)我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物回到阶乘的递归算法上来。假设要计算回到阶乘的递归算法上来。假设要计算5的阶乘,通过前面设的阶乘,通过前面设计的递归程
13、序执行过程如下。计的递归程序执行过程如下。首先,在主函数中调用首先,在主函数中调用fact(5)函数,将返回地址、参数、局部函数,将返回地址、参数、局部变量压入堆栈。变量压入堆栈。 我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物在在fact()函数中,判断函数中,判断n的值若不为的值若不为0,则递归调用,则递归调用fact(4),这时将函数的返回地址和参数压入堆栈。,这时将函数的返回地址和参数压入堆栈。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的
14、猜测没有错:表里边有一个活的生物程序继续递归调用时,将程序继续递归调用时,将fact(3)、fact(2)、fact(1)逐步压入堆栈逐步压入堆栈我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物当调用当调用fact(0)时,达到阶乘递归算法的结束条件,时,达到阶乘递归算法的结束条件,这时结束这时结束fact(0)函数调用,从堆栈中弹出该层的相函数调用,从堆栈中弹出该层的相关数据,并返回函数的结果关数据,并返回函数的结果1。这时栈顶中保存的将。这时栈顶中保存的将是是fact(1)中的相关数据中的相关数据我吓了
15、一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物当递归函数逐层返回时,栈中压入的数据将逐步弹当递归函数逐层返回时,栈中压入的数据将逐步弹出,当弹出出,当弹出fact(4)后的栈结果如图所示后的栈结果如图所示我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物当函数当函数fact(5)返回时得到返回时得到5的阶乘等于的阶乘等于120,同时从,同时从栈中弹出调用函数时的数据,完成整个递归调用,栈中弹出调用函数时的数据,完成整个递归调用
16、,并返回主函数输出执行。并返回主函数输出执行。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物搜索深度优先搜索一、算法模型二、经典应用我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物一、引例 例1:输入一个数n,按字典序从小到大的顺序输出1n的全排列。两个序列的字典序大小关系等价于从开始的第一个不相同位置处的大小关系。例如,(1,3,2) (2,1,3) 当n = 3时,所有排序的排序结果是(1,2,3)、(1,3,2)
17、、(2,1,3)、(2,3,1)、(3,1,2)、(3,2,1)。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物一、引例 方法一 var a, b, c : integer; begin for a := 1 to 3 do for b := 1 to 3 do for c := 1 to 3 do begin if (a b) and (b c) and (c a) then writeln(a, ,b, ,c); end; end.我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世
18、界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 方法一、穷举法方法一、穷举法 寻找问题解的一种可靠的方法是首先寻找问题解的一种可靠的方法是首先列出所有可能候选解,然后依次检查每一个,列出所有可能候选解,然后依次检查每一个,在检查完所有或部分候选解后,即可找到所需在检查完所有或部分候选解后,即可找到所需要的解。理论上,当候选解数量有限并且通过要的解。理论上,当候选解数量有限并且通过检查所有或部分候选解能够得到所需解时,上检查所有或部分候选解能够得到所需解时,上述方法是可行的。不过在实际应用中,很少使述方法是可行的。不过在实际应用中,很少使用这种方法,因为候选解的数量通常都非常
19、大用这种方法,因为候选解的数量通常都非常大,即便采用最快的计算机也只能解决规模很小,即便采用最快的计算机也只能解决规模很小的问题。的问题。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 方法二 这里我们先将这个问题形象化,举个例子,假设有编号为1、2、3的3张扑克牌和编号为1、2、3的3个盒子。现在需要将这3张扑克牌分别放到3个盒子里面,并且每个盒子有且只能放一张扑克牌,那么一共有多少种不同的方法呢?我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜
20、测没有错:表里边有一个活的生物我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物我吓了一跳,蝎子是多么丑恶
21、和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物一、引例 方法二、回溯法 从问题的某一种可能出发, 搜索从这种情况出发所能达到的所有可能, 当这一条路走到“ 尽头 ”而没达到目的地的时候, 再倒回上一个出发点, 从另一个可能出发, 继续搜索. 这种不断“ 倒回 一步寻找解的方法, 称作 回溯法 .我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的
22、猜测没有错:表里边有一个活的生物程序实现程序实现我们先来解决最基本的问题:如何往小盒子中放扑克牌。每一个小盒子都可能放1号、2号或者3号扑克牌,这需要一一尝试,用一个for循环即可解决。for i := 1 to n do /枚举1n张牌 astep := i; /将i号扑克牌放入到第step个盒子中分析:数组a用来表示小盒子,变量step表示当前正处在第step个小盒子面前。astep := i; 表示将i号扑克牌放入到第step个盒子中。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物这里有一个问题:如
23、果判断该扑克牌是否还在手中,而没这里有一个问题:如果判断该扑克牌是否还在手中,而没有放入其他盒子中?有放入其他盒子中?for i = 1 to n dobegin If usedi = false then /如果i号扑克牌仍在手中 begin astep := i; /将i号扑克牌放入到第step个盒子中 usedi := true; /标记i号扑克牌已不在手中 end;1. end;123FFF123TFF123TTF我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物OK,现在已经处理完第step个小盒子
24、了,接下来需要往下走一步,继续处理第step+1盒小盒子,处理方法与第step步完全相同。因此我们不妨将刚才处理第step个小盒子的代码封装为一个函数,函数的名字就叫做dfs吧!procedure dfs(step:integer)begin for i := 1 to n do begin If usedi = false begin astep := i; usedi := true; end; end;1.end;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物由此,处理第step个盒子,我们可调用d
25、fs(step)完成,而处理第step+1个盒子,就是dfs(step+1)由此我们不妨使用函数的递归调用加以实现。procedure dfs(step:integer)begin for i := 1 to n do begin if usedi = false begin astep := i; usedi := true; dfs(step+1); /继续尝试第继续尝试第step+1个盒子个盒子 usedi = false; /取回刚刚尝试的那张牌取回刚刚尝试的那张牌 end; end;1.end;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深度 优先 搜索 ppt 课件
限制150内