文章目录
深度优先搜索
1.n张牌分别放进n个盒子,有几种方案
思路:
代码流程:
DFS()
{
- 处理边界,向上回退
- 尝试当前的每一种可能
- 确定一种可能后,递归处理下一步----DFS(下一步)
- 回收本次处理结果
}
#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;
}
从上面的代码可以看出,深度优先搜索的关键是解决"当下该如何做",下一步的做法和当下的做法是一样的。
"当下如何做"一般是尝试每一种可能,用for循环遍历,对于每一种可能确定之后,继续走下一步,当前的剩余可能等到从下一步回退之后再处理。
我们可以抽象出深度优先搜索的模型。
2.leetcode 690 员工重要性
思路:
深度优先搜索的做法非常直观。根据给定的员工编号找到员工,从该员工开始遍历,对于每个员工,将其重要性加到总和中,然后对该员工的每个直系下属继续遍历,直到所有下属遍历完毕,此时的总和即为给定的员工及其所有下属的重要性之和。
实现方面,由于给定的是员工编号,且每个员工的编号都不相同,因此可以使用哈希表存储每个员工编号和对应的员工,即可通过员工编号得到对应的员工。
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 图像渲染
思路:注意这里一定要用 visited数组标记已经访问过的像素,否则会有极端测试用例无法通过
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