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;
}
};