【ACM训练三】深度优先搜索与广度优先搜索
作者:互联网
广度优先搜索
定义
大神讲解链接:https://blog.csdn.net/raphealguo/article/details/7523411
相关知识
队列:先进先出
大神讲解链接:https://www.cnblogs.com/linuxAndMcu/p/7735444.html
例:
struct cor //利用结构体构造点
{
int x,y;
cor(){} //无参构造函数; 初始化
cor(int x,int y)
{x=_x; y=_y;}
}
queue<cor> Q; //建立队列
cor a;
a.x=a; a.y=1;
Q.push(cor(1,1));//将点(1,1)放入队列中,且此时返回(1,1)
Q.push(a);
Q.pop();//队首的元素出列
cout<<Q.front();//输出队首的元素
模板
/**
* 广度优先搜索 ——Vs 为起点、Vd为 终点
*/
bool BFS(Node& Vs, Node& Vd)
{
queue<Node> Q;
Node Vn, Vw;
int i;
//用于标记颜色当visit[i][j]==true时,说明节点访问过,也就是黑色
bool visit[MAXL][MAXL];
//四个方向
int dir[][2] = {
{0, 1}, {1, 0},
{0, -1}, {-1, 0}
};
//初始状态将起点放进队列Q
Q.push(Vs);
visit[Vs.x][Vs.y] = true;//设置节点已经访问过了!
while (!Q.empty()){//队列不为空,继续搜索!
//取出队列的头Vn
Vn = Q.front();
Q.pop();
for(i = 0; i < 4; ++i){
Vw = Node(Vn.x+dir[i][0], Vn.y+dir[i][1]);//计算相邻节点
if (Vw == Vd){//找到终点了!
//把路径记录,这里没给出解法
return true;//返回
}
if (isValid(Vw) && !visit[Vw.x][Vw.y]){
//Vw是一个合法的节点并且为白色节点
Q.push(Vw);//加入队列Q
visit[Vw.x][Vw.y] = true;//设置节点颜色
}
}
}
return false;//无解
}
例题
板子题:https://blog.csdn.net/qq_38980688/article/details/80765590
深度优先搜索
定义
大神讲解链接:https://blog.csdn.net/liangzhaoyang1/article/details/51415719
相关知识
递归函数
模板
/**
* DFS核心伪代码
* 前置条件是visit数组全部设置成false
* n 当前开始搜索的节点
* d 当前到达的深度
* return 是否有解
*/
bool DFS(Node n, int d){
if (isEnd(n, d)){//一旦搜索深度到达一个结束状态,就返回true
return true;
}
for (Node nextNode in n){//遍历n相邻的节点nextNode
if (!visit[nextNode]){//
visit[nextNode] = true;//在下一步搜索中,nextNode不能再次出现
if (DFS(nextNode, d+1)){//如果搜索出有解
//做些其他事情,例如记录结果深度等
return true;
}
//重新设置成false,因为它有可能出现在下一次搜索的别的路径中
visit[nextNode] = false;
}
}
return false;//本次搜索无解
}
例题
http://www.edu2act.cn/article/suan-fa-xue-xi-shen-du-you-xian-sou-suo-dfs/
剪枝
明显不行的情况——放弃
大佬博客:https://www.cnblogs.com/fenghaoran/p/6391016.html
标签:优先,nextNode,visit,ACM,搜索,Vw,true,节点 来源: https://blog.csdn.net/slozer/article/details/94742430