搜索算法--DFS(深度优先遍历算法)


DFS

模板

#include<iostream>
using namespace std;
#include<vector>

void dfs(vector<int>& boxs, vector<int>& used, int index){
    
    
	if (index == boxs.size()){
    
    
		for (int i = 1; i < boxs.size(); i++){
    
    
			cout << boxs[i] << " ";
		}
		cout << endl;
		return;
	}
	//处理当前盒子
	for (int i = 1; i<boxs.size(); i++){
    
    
		if (used[i] == 0){
    
    
			boxs[index] = i;
			used[i] = 1;
			dfs(boxs, used, index + 1);
			used[i] = 0;
		}
	}
}

int main(){
    
    
	int n;
	cin >> n;
	vector<int> boxs(n+1, 0);
	vector<int> used(n + 1, 0);
	dfs(boxs, used, 1);
	system("pause");
	return 0;
}

例题1:员工的重要性

LeetCode:员工的重要性

/*
// Definition for Employee.
class Employee {
public:
    int id;
    int importance;
    vector<int> subordinates;
};
*/

class Solution {
    
    
public:
    int dfs(unordered_map<int,Employee*>& um,int id){
    
    
        int count=um[id]->importance;
        for(auto e:um[id]->subordinates){
    
    
            count+=dfs(um,e);
        }
        return count;
    }
    int getImportance(vector<Employee*> employees, int id) {
    
    
        if(employees.empty()){
    
    
            return 0;
        }
        unordered_map<int,Employee*> um;
        for(auto e:employees){
    
    
            um[e->id]=e;
        }
        return dfs(e,id);
    }
};

例题2:图像渲染

LeetCode:图像渲染

class Solution {
    
    
public:
    int nums[4][2]={
    
    {
    
    -1,0},{
    
    1,0},{
    
    0,-1},{
    
    0,1}};
    void dfs(vector<vector<int>>& image,int sr,int sc,vector<vector<int>>& exist,int newColor,int oldColor){
    
    
        //1.首先将起始点染色
        image[sr][sc]=newColor;
        exist[sr][sc]=1;
        //2.上下左右
        for(int i=0;i<4;i++){
    
    
            int new_sr=sr+nums[i][0];
            int new_sc=sc+nums[i][1];

            if(new_sr<0||new_sr>=image.size()||new_sc<0||new_sc>=image[0].size()){
    
    
                continue;
            }
            if(image[new_sr][new_sc]==oldColor&&exist[new_sr][new_sc]==0){
    
    
                dfs(image,new_sr,new_sc,exist,newColor,oldColor);
            }
        }

    }
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor)     {
    
    
        vector<vector<int>> exist(image.size(),vector<int>(image[0].size(),0));
        int oldColor=image[sr][sc];
        dfs(image,sr,sc,exist,newColor,oldColor);
        return image;
    }
};

例题3.被围绕的区域

LeetCode:被围绕的区域
在这里插入图片描述

class Solution {
    
    
public:
    int nums[4][2]={
    
    {
    
    -1,0},{
    
    1,0},{
    
    0,-1},{
    
    0,1}};
    void dfs(vector<vector<char>>& board,int x,int y){
    
    
        board[x][y]='a';
        for(int i=0;i<4;i++){
    
    
            int newx=x+nums[i][0];
            int newy=y+nums[i][1];

            if(newx<0||newx>=board.size()||newy<0||newy>=board[0].size()){
    
    
                continue;
            }

            if(board[newx][newy]=='O'){
    
    
                dfs(board,newx,newy);
            }
        }
    }
    void solve(vector<vector<char>>& board) {
    
    
        for(int i=0;i<board.size();i++){
    
    
            if(board[i][0]=='O'){
    
    
                dfs(board,i,0);
            }
            if(board[i][board[0].size()-1]=='O'){
    
    
                dfs(board,i,board[0].size()-1);
            }
        }
        for(int i=0;i<board[0].size();i++){
    
    
            if(board[0][i]=='O'){
    
    
                    dfs(board,0,i);
                }
                if(board[board.size()-1][i]=='O'){
    
    
                    dfs(board,board.size()-1,i);
                }
        }
        for(int i=0;i<board.size();i++){
    
    
            for(int j=0;j<board[0].size();j++){
    
    
                if(board[i][j]=='O'){
    
    
                    board[i][j]='X';
                }
                if(board[i][j]=='a'){
    
    
                    board[i][j]='O';
                }
            }
        }
    }
};

例题4.岛屿数量(联通区域个数问题)

LeetCode:岛屿数量

class Solution {
    
    
public:
    int nums[4][2]={
    
    {
    
    -1,0},{
    
    1,0},{
    
    0,-1},{
    
    0,1}};
    void dfs(vector<vector<char>>& grid,int x,int y,vector<vector<bool>>& exist){
    
    
        exist[x][y]=true;

        for(int i=0;i<4;i++){
    
    
            int newx=x+nums[i][0];
            int newy=y+nums[i][1];

            if(newx<0||newx>=grid.size()||newy<0||newy>=grid[0].size()){
    
    
                continue;
            }

            if(grid[newx][newy]=='1'&&exist[newx][newy]==false){
    
    
                dfs(grid,newx,newy,exist);
            }
        }
    }
    int numIslands(vector<vector<char>>& grid) {
    
    
        vector<vector<bool>> exist(grid.size(),vector<bool>(grid[0].size(),false));
        int count=0;
        for(int i=0;i<grid.size();i++){
    
    
            for(int j=0;j<grid[0].size();j++){
    
    
                if(grid[i][j]=='1'&&exist[i][j]==false){
    
    
                    count++;
                    dfs(grid,i,j,exist);
                }
            }
        }
        return count;
    }
};

猜你喜欢

转载自blog.csdn.net/Hedenghui777/article/details/116041238