【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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值