DFS、BFS经典例题

文章目录深度优先搜索1.n张牌分别放进n个盒子,有几种方案2.leetcode 690 员工重要性3.leetcode 733 图像渲染4.leetcode 130 被围绕的区域5.leetcode 200 岛屿数量广度优先搜搜索1.走迷宫问题2.员工重要性3.N叉树的层序遍历深度优先搜索1.n张牌分别放进n个盒子,有几种方案思路:代码流程:DFS(){处理边界,向上回退尝试当前的每一种可能确定一种可能后,递归处理下一步----DFS(下一步)回收本次处理结果}#include
摘要由CSDN通过智能技术生成

深度优先搜索

在这里插入图片描述

1.n张牌分别放进n个盒子,有几种方案

思路:

代码流程:

DFS()

{

  1. 处理边界,向上回退
  2. 尝试当前的每一种可能
  3. 确定一种可能后,递归处理下一步----DFS(下一步)
  4. 回收本次处理结果

}

#include<iostream>
#include<vector>

using namespace std;

//n张牌放进n个盒子,求有几种方案
void DFS(vector<int>& box,vector<int>& used,int idx)
{
   
	//递归的边界条件
	if (idx == box.size())
	{
   
		for (int i = 1; i < box.size(); i++)
		{
   
			cout << box[i] << " ";
		}
		cout << endl;
		return;
	}
	
	//处理当前盒子
	for (int i = 1; i < box.size(); i++)
	{
   
		//判断当前的牌是否用过
		if (used[i] == 0)
		{
   
			used[i] = 1;
			box[idx] = i;

			//处理剩余的盒子
			DFS(box, used, idx+1);

			//回收当前使用的牌
			used[i] = 0;
		}
	}
}

int main()
{
   
	int n = 0;
	cin >> n;
	vector<int> box(n+1, 0);
	vector<int> used(n+1, 0);

	DFS(box, used, 1);

	return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q5309ULh-1631532843512)(C:\Users\宇轩\AppData\Roaming\Typora\typora-user-images\image-20210807194753944.png)]

从上面的代码可以看出,深度优先搜索的关键是解决"当下该如何做",下一步的做法和当下的做法是一样的。

"当下如何做"一般是尝试每一种可能,用for循环遍历,对于每一种可能确定之后,继续走下一步,当前的剩余可能等到从下一步回退之后再处理。

我们可以抽象出深度优先搜索的模型。

2.leetcode 690 员工重要性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gBMp7dnz-1631532843516)(D:\C++markdown文件\搜索算法.assets\image-20210807202336063.png)]

思路:

深度优先搜索的做法非常直观。根据给定的员工编号找到员工,从该员工开始遍历,对于每个员工,将其重要性加到总和中,然后对该员工的每个直系下属继续遍历,直到所有下属遍历完毕,此时的总和即为给定的员工及其所有下属的重要性之和。

实现方面,由于给定的是员工编号,且每个员工的编号都不相同,因此可以使用哈希表存储每个员工编号和对应的员工,即可通过员工编号得到对应的员工。

class Solution {
   
public:
    unordered_map<int, Employee *> mp;

    int dfs(int id) 
    {
   
        Employee *employee = mp[id];
        int total = employee->importance;
        for (int subId : employee->subordinates) 
        {
   
            total += dfs(subId);
        }
        return total;
    }

    int getImportance(vector<Employee *> employees, int id) 
    {
   
        for (auto &employee : employees) 
        {
   
            mp[employee->id] = employee;
        }
        return dfs(id);
    }
};

3.leetcode 733 图像渲染

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9buewbWL-1631532843521)(D:\C++markdown文件\搜索算法.assets\image-20210808110217481.png)]

思路:注意这里一定要用 visited数组标记已经访问过的像素,否则会有极端测试用例无法通过

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f81IhXQM-1631532843523)(D:\C++markdown文件\搜索算法.assets\image-20210808111352425.png)]

int nextP[4][2]={
  {-1,0},{1,0},{0,-1},{0,1}};
class Solution {
public:
    void DFS(vector<vector<int>>& image, int row, int col, int oldColor
    , vector<vector<int>>& visited, int newx, int newy, int newColor)
    {
        //1.染色
        image[newx][newy]=newColor;
        visited[newx][new
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值