Handout16
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
访问顶点v 依次从v的未被访问的邻接点出发,对图进行深度优
先遍历;直至图中和v有路径相通的顶点都被访问 若此时图中尚有顶点未被访问,则从一个未被访问
的顶点出发,重新进行深度优先遍历,直到图中所 有顶点均被访问过为止
北京大学《程序设计实习》课程
深度优先搜索:形式化描述
两个状态的集合
: 未处理完的状态 : 已处理的状态
策略 深度优先搜索(本讲内容):每次从队列中取方块时,总是取最后放 入的那一块 广度优先(下一讲介绍) :每次从队列中取方块时,总是取最早放 入的那一块
北京大学《程序设计实习》课程
room[i,j]生成过程的特点
room[i,j]={(i j)}room[i-1,y]room[i+1,y]room[i,y-1]room[i,y+1] 对方块(i j)标记后,再求解子问题room[i-1,y]、room[i+1,y]、room[i,y-
题策略下, 解决room[i,y](标记方块(i j))时要依赖room[i-1,y]、 room[i+1,y]、room[i,y-1]、room[i,y+1]的结果 按照递归的策略:先分解出room[i-1,y]、room[i+1,y]、room[i,y-1]
、room[i,y+1]并解决之,再解决room[i,j] 按照动态规划的策略:先解决room[i-1,y]、room[i+1,y]、room[i,y-
从中选择被演化状态的原则:离初态S0最远的 状态s
S0到s的距离:从S0到达s使用的动作数量
生成过程 从东、南、西、北四个方向分别递推 每一次递推,使得room[i,j]中被标记方块的数量加1
关键:对任何一个方块,东、南、西、北四个方向的递推都要做到没 有遗漏,可以使用一个队列, 保存从已标记方块可达的那些方块 每次从队列中取出一个方块:东、南、西、北四个方向可达、且 未被标记的方块继续放入队列中
北京大学《程序设计实习》课程
比如,对于样例输入的标记 1 12 2 333 1 11 2 343 1 11 5 353 1 55 5 553
从而一共有5个房间,最大的房间(1)占据9个格子
北京大学《程序设计实习》课程
room[i,j]的表示和生成过程
表示:从方块(i, j)可达的方块的标记 初始时, room[i,j]的每个方块都未标记 结束时, room[i,j]的所有方块都被标记
北京大学《程序设计实习》课程
问题分析
实质是对城堡中的方块进行分组:同一房间的方块作为 一组 分组的数量 单个分组中方块数量的最大值
思路:对每个方块(i, j),寻找可与其同组的那些方块。 只能算在唯一一个房间的面积里面 对每个方块做标记 以所属分组的编号作为方块的标记
记room[i,j]为方块(i, j)所属分组,计算room[i,j]的解题思 路:递推,分别考虑(i, j)的东、西、南、北四个邻居 (x,y),若方块(i, j)和(x,y)之间没有被墙隔开,则 room[i,j]={(x,y)}room[x,y] 终止条件:方块 (x,y)已做标记
1]、room[i,y+1] 子问题room[i-1,y]、room[i+1,y]、room[i,y-1]、room[i,y+1]一旦生成,
就与room[i,j]独立 room[i,j]不需要用到room[i-1,y]、room[i+1,y]、room[i,y-1]、
room[i,y+1]的解 注意该问题解决策略与递归策略、动态规划策略的区别,在这两种解
输出
城堡的房间数、城堡中最大房间所包括的方块数。 结果显示在标准输出设备上。
北京大学《程序设计实习》课程百度文库
样例输入输出
样例输入 4 7 11 6 11 6 3 10 6 7 9 6 13 5 15 5 1 10 12 7 13 7 5 13 11 10 8 10 12 13 样例输出 5 9
1]、room[i,y+1],再解决room[i,j]
北京大学《程序设计实习》课程
搜索的过程:形式化描述
两个状态的集合
: 未处理完的状态 : 已处理的状态
状态的处理: 有顺序的尝试备选动作, 每一次的尝试 都演化出另一个状态
已处理的状态: 全部备选动作都已经尝试
一个树结构: 状态之间的演化关系 递归的出口
北京大学《程序设计实习》课程
输入输出
输入
程序从标准输入设备读入数据。 第一行是两个整数,分别是南北向、东西向的方块数。 在接下来的输入行里,每个方块用一个数字(0≤p≤50)描
述。用一个数字表示方块周围的墙,1表示西墙,2表示 北墙,4表示东墙,8表示南墙。每个方块用代表其周围 墙的数字之和表示。城堡的内墙被计算两次,方块(1,1) 的南墙同时也是方块(2,1)的北墙。 输入的数据保证城堡至少有两个房间。
程序设计实习之编程思路
第十八讲 深度优先搜索篇
内容提要
深度优先搜索 POJ 2815 城堡问题 POJ 1011 棍子问题
北京大学《程序设计实习》课程
例题:POJ2815 城堡问题
右图是一个城堡的地形图 。请你编写一个程序,计 算城堡一共有多少房间, 最大的房间有多大。城堡 被分割成m×n(m≤50, n≤50)个方块,每个方块可 以有0~4面墙。
为空 演化出目标状态S* 演化出的状态不属于
北京大学《程序设计实习》课程
搜索的难点
状态的表达 状态演化关系树的表达
当前状态的备选动作集合、以及其中已经尝试的动 作和未尝试的动作
北京大学《程序设计实习》课程
影响搜索效率的因素
两个状态的集合
: 未处理完的状态 : 已处理的状态
判重:每次演化出一个状态s时,s是否属于或 者
剪枝:状态s的任意演化结果是否都属于
属于,则剪枝
演化出来的状态数量:的大小
北京大学《程序设计实习》课程
深度优先搜索(Depth-First-Search)
将整个问题空间表示为一颗树。
每个顶点表示一个问题 顶点的子节点表示对该问题的分解
所有顶点都解决后,整个问题就解决了 问题求解顺序:从图中某顶点v出发
先遍历;直至图中和v有路径相通的顶点都被访问 若此时图中尚有顶点未被访问,则从一个未被访问
的顶点出发,重新进行深度优先遍历,直到图中所 有顶点均被访问过为止
北京大学《程序设计实习》课程
深度优先搜索:形式化描述
两个状态的集合
: 未处理完的状态 : 已处理的状态
策略 深度优先搜索(本讲内容):每次从队列中取方块时,总是取最后放 入的那一块 广度优先(下一讲介绍) :每次从队列中取方块时,总是取最早放 入的那一块
北京大学《程序设计实习》课程
room[i,j]生成过程的特点
room[i,j]={(i j)}room[i-1,y]room[i+1,y]room[i,y-1]room[i,y+1] 对方块(i j)标记后,再求解子问题room[i-1,y]、room[i+1,y]、room[i,y-
题策略下, 解决room[i,y](标记方块(i j))时要依赖room[i-1,y]、 room[i+1,y]、room[i,y-1]、room[i,y+1]的结果 按照递归的策略:先分解出room[i-1,y]、room[i+1,y]、room[i,y-1]
、room[i,y+1]并解决之,再解决room[i,j] 按照动态规划的策略:先解决room[i-1,y]、room[i+1,y]、room[i,y-
从中选择被演化状态的原则:离初态S0最远的 状态s
S0到s的距离:从S0到达s使用的动作数量
生成过程 从东、南、西、北四个方向分别递推 每一次递推,使得room[i,j]中被标记方块的数量加1
关键:对任何一个方块,东、南、西、北四个方向的递推都要做到没 有遗漏,可以使用一个队列, 保存从已标记方块可达的那些方块 每次从队列中取出一个方块:东、南、西、北四个方向可达、且 未被标记的方块继续放入队列中
北京大学《程序设计实习》课程
比如,对于样例输入的标记 1 12 2 333 1 11 2 343 1 11 5 353 1 55 5 553
从而一共有5个房间,最大的房间(1)占据9个格子
北京大学《程序设计实习》课程
room[i,j]的表示和生成过程
表示:从方块(i, j)可达的方块的标记 初始时, room[i,j]的每个方块都未标记 结束时, room[i,j]的所有方块都被标记
北京大学《程序设计实习》课程
问题分析
实质是对城堡中的方块进行分组:同一房间的方块作为 一组 分组的数量 单个分组中方块数量的最大值
思路:对每个方块(i, j),寻找可与其同组的那些方块。 只能算在唯一一个房间的面积里面 对每个方块做标记 以所属分组的编号作为方块的标记
记room[i,j]为方块(i, j)所属分组,计算room[i,j]的解题思 路:递推,分别考虑(i, j)的东、西、南、北四个邻居 (x,y),若方块(i, j)和(x,y)之间没有被墙隔开,则 room[i,j]={(x,y)}room[x,y] 终止条件:方块 (x,y)已做标记
1]、room[i,y+1] 子问题room[i-1,y]、room[i+1,y]、room[i,y-1]、room[i,y+1]一旦生成,
就与room[i,j]独立 room[i,j]不需要用到room[i-1,y]、room[i+1,y]、room[i,y-1]、
room[i,y+1]的解 注意该问题解决策略与递归策略、动态规划策略的区别,在这两种解
输出
城堡的房间数、城堡中最大房间所包括的方块数。 结果显示在标准输出设备上。
北京大学《程序设计实习》课程百度文库
样例输入输出
样例输入 4 7 11 6 11 6 3 10 6 7 9 6 13 5 15 5 1 10 12 7 13 7 5 13 11 10 8 10 12 13 样例输出 5 9
1]、room[i,y+1],再解决room[i,j]
北京大学《程序设计实习》课程
搜索的过程:形式化描述
两个状态的集合
: 未处理完的状态 : 已处理的状态
状态的处理: 有顺序的尝试备选动作, 每一次的尝试 都演化出另一个状态
已处理的状态: 全部备选动作都已经尝试
一个树结构: 状态之间的演化关系 递归的出口
北京大学《程序设计实习》课程
输入输出
输入
程序从标准输入设备读入数据。 第一行是两个整数,分别是南北向、东西向的方块数。 在接下来的输入行里,每个方块用一个数字(0≤p≤50)描
述。用一个数字表示方块周围的墙,1表示西墙,2表示 北墙,4表示东墙,8表示南墙。每个方块用代表其周围 墙的数字之和表示。城堡的内墙被计算两次,方块(1,1) 的南墙同时也是方块(2,1)的北墙。 输入的数据保证城堡至少有两个房间。
程序设计实习之编程思路
第十八讲 深度优先搜索篇
内容提要
深度优先搜索 POJ 2815 城堡问题 POJ 1011 棍子问题
北京大学《程序设计实习》课程
例题:POJ2815 城堡问题
右图是一个城堡的地形图 。请你编写一个程序,计 算城堡一共有多少房间, 最大的房间有多大。城堡 被分割成m×n(m≤50, n≤50)个方块,每个方块可 以有0~4面墙。
为空 演化出目标状态S* 演化出的状态不属于
北京大学《程序设计实习》课程
搜索的难点
状态的表达 状态演化关系树的表达
当前状态的备选动作集合、以及其中已经尝试的动 作和未尝试的动作
北京大学《程序设计实习》课程
影响搜索效率的因素
两个状态的集合
: 未处理完的状态 : 已处理的状态
判重:每次演化出一个状态s时,s是否属于或 者
剪枝:状态s的任意演化结果是否都属于
属于,则剪枝
演化出来的状态数量:的大小
北京大学《程序设计实习》课程
深度优先搜索(Depth-First-Search)
将整个问题空间表示为一颗树。
每个顶点表示一个问题 顶点的子节点表示对该问题的分解
所有顶点都解决后,整个问题就解决了 问题求解顺序:从图中某顶点v出发