pascal 深搜
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pascal 深搜相关的知识,希望对你有一定的参考价值。
如题..深搜是什么算法?最好带流程图。 说懂追150,谢了
额..虽然全都看不懂..但还是很感谢几位的回答..
深度搜索是数据结构中 树形结构的一种遍历方法 所谓遍历 就是一个一个查找 搜索就是遍历所有结点并且检查关键字是否匹配 树的深度搜索和广度搜索区别就是 深度搜索是按照深度优先原则 先笔直往下找子结点 找到那个结点后 又找这个结点的子结点。
与深搜对应的就是广度搜索,是按照以层为优先进行搜索 树都是一层一层的 找到一个结点后 又找这个结点的兄弟结点。
追问树型数据结构是什么?在什么数据处理时会用到?
追答要详细解析树形数据结构,那内容可以写一本书了。
数据结构本来就是一个学科。
简单的说,数据结构是用一种合理的的方法组织数据,目的是让写数据和读数据的时候更加便捷和高效率。
举个例子,如果你要向一棵没有叶子的树上挂上树叶,那树叶的数量可能以万为单位的,每片树叶都有一个独一无二的编号。挂上去后,当你要从树上找指定编号的树叶时,如果挂的时候没有很好的组织和编排树叶的位置,那找的时候就是一场噩梦。良好的数据结构,可以大大的缩短查找树叶的时间。
[深度搜索]
<Var>
Open:Array[1..Max] of Node;(待扩展节点表)
Close:Array[1..Max] of Node;(已扩展节点表)
openL,closeL:Integer;(表的长度)
New-S:Tsituation;(新状态)
<Init>
Open<-0; Close<-0;
OpenL<-1;CloseL<-0;
Open[1].Situation<- 初始状态;
Open[1].Level<-1;
Open[1].Last<-0;
<Main Program>
While (openL>0) and (closeL<Max) and (openL<Max) do
Begin
closeL:=closeL+1;
Close[closeL]:=Open[openL];
openL:=openL-1;
For I:=1 to TotalExpendMethod do(扩展一层子节点)
Begin
New-S:=ExpendNode(Close[closeL].Situation,I);
If Not (New-S in List) then
(扩展出的节点从未出现过)
Begin
openL:=openL+1;
Open[openL].Situation:=New-S;
Open[openL].Level:=Close[closeL].Level+1;
Open[openL].Last:=closeL;
End-If
End-For;
End;
范例:迷宫问题,求解最短路径和可通路径。
评价:深度搜索多用于只要求解,并且解答树中的重复节点较多并且重复较难判断时使用,但往往可以用分支定界或回溯算法代替。
希望这个回答对你有帮助!~追问
树型数据结构是什么?在什么数据处理时会用到?
参考技术B 一、深度优先搜索的过程深度优先搜索所遵循的搜索策略是尽可能“深”地搜索图。在深度优先搜索中,对于最新发现的节点,如果它还有以此为起点而未搜索的边,就沿此边继续搜索下去。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v有那条边的始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被发现为止。
这种在搜索过程中,深度大的结点先进行扩展的算法,我们就称它为深度优先搜索法。英语称之为Depth-First-Search,简称为DFS法。
二、深度优先搜索法有两个显著特点
(1)对已产生的结点按深度排序存储,深度大的先得到扩展,即先产生它的子结点;
(2)深度大的结点是后产生的,但先得到扩展,即“后产生先扩展”。因此该算法应该用堆栈作为的主要数据结构存储产生的结点:先把产生的数入栈,然后产生栈顶(即深度最大的结点)的子结点。子结点产生完后,出栈(pop)再产生栈顶的子结点。
三、深度优先搜索算法描述
程序实现有两种方式--递归与非递归。
递归
递归过程为:
Procedure DEF-GO(step)
for i:=1 to max do
if 子结点符合条件 then
产生新的子结点入栈;
if 子结点是目标结点 then 输出
else DEF-GO(step+1);
栈顶结点出栈;
endif;
enddo;
主程序为:
Program DFS;
初始状态入栈;
DEF-GO(1);
非递归
Program DEF(step);
step:=0;
repeat
step:=step+1;
j:=0;p:=false
repeat
j:=j+1;
if 结点符合条件 then
产生子结点入栈;
if 子结点是目标结点 then 输出
else p:=true;
else
if j>=max then 回溯 p:=false;
endif;
until p=true;
until step=0;
回溯过程如下:
Procedure BACK;
step:=step-1;
if step>0 then 栈顶结点出栈
else p:=true;
两种方式本质上是等价,但两者也时有区别的。
1. 递归方式实现简单,非递归方式较之比较复杂;
2. 递归方式需要利用栈空间,如果搜索量过大的话,可能造成栈溢出,所以在栈空间无法满足的情况下,选用非递归实现方式较好。追问
树型数据结构是什么?在什么数据处理时会用到?
追答树型结构是一类重要的非线形数据结构。其中以树和二叉树最为常用,直观看来,树是以分支关系定义层次结构。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织结构都可以用树来形象表示。如下图的家谱结构。
图6.1一个家族的结构
树在计算机科学的许多领域中有着广泛的应用。人们用树进行电路分析;用树表示数学公式的结构;在数据库系统中,用树组织信息;在编译过程中,用树表示源程序的句法结构。本章重点讨论树的一些基本概念,二叉树的存储结构及各种操作,并研究树和森林与二叉树的转换关系。
深搜就是深度优先搜索,从名字上可以看出,深度——由浅入深,为标准进行的搜索,就像是你从你爷爷辈开始点人头,每次都要数到辈数最小,数到后又像上辈数,如果一个上辈有下辈的话,就又数到辈数最小的。
追问树型数据结构是什么?在什么数据处理时会用到?
参考技术D 至于深搜 额....就是 用递归调用加回溯
基本格式大概是这样的
procedure dfs(x:longint);
begin
if 这里写跳出这个递归的条件 满足就是搜到了要找的
if 这里写你的程序的应满足条件
then ...
dfs(); 从这里开始继续向下搜索
上个if里 你对某些变量做了修改 但他不一定正确 所以你应在这里写一个回溯
即把then里的东西弄回去 可以理解成返回上一种情况(dfs最重要的部分)
end;
不大好解释..
但说白了就是有点特殊的枚举 枚举方向与别的枚举不大一样
建议楼主去翻翻竞赛书 上网上找个ppt看看追问
树型数据结构是什么?在什么数据处理时会用到?
参考资料:自己写的
深搜(DFS),回溯,Fire Net
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2
解题报告:
这里的深搜有一点不同,就是,在深搜每一个点时,都要深搜每一个点,就是一个完全二叉树。
借鉴:http://blog.csdn.net/zxy_snow/article/details/5952668
#include <stdio.h> #include <iostream> #include <stdlib.h> using namespace std; int visit[10][10],mmax,n,cou; ///visit 里面为0,表示没有东西,1表示有碉堡,2表示有墙; ///cou,计数当下放的碉堡个数 ///mmax,表示最佳方案 int canPut(int x,int y)///计算是否可以放碉堡 { ///有碉堡,则返回0 for(int i=y;i>=1;i--) { if(visit[x][i]==1) return 0; if(visit[x][i]==2) break; } for(int i=y;i<=n;i++) { if(visit[x][i]==1) return 0; if(visit[x][i]==2) break; } for(int i=x;i>=1;i--) { if(visit[i][y]==1) return 0; if(visit[i][y]==2) break; } for(int i=x;i<=n;i++) { if(visit[i][y]==1) return 0; if(visit[i][y]==2) break; } return 1; } ///DFS void dfs() { if(cou>mmax) mmax=cou; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(!visit[i][j]&&canPut(i,j)) { visit[i][j]=1; cou++; dfs(); visit[i][j]=0; cou--; } } } } int main() { char str[10]; while(scanf("%d",&n),n) { mmax=0,cou=0; for(int i=1;i<=n;i++) { cin>>str; for(int j=0;j<n;j++) { visit[i][j+1]=(str[j]==‘X‘)?2:0; } } dfs(); cout<<mmax<<endl; } return 0; }
以上是关于pascal 深搜的主要内容,如果未能解决你的问题,请参考以下文章