【算法学习之路】12.DFS

DFS

  • 前言
  • 一.DFS简介
  • 二.思路
  • 三.缺点
  • 四.三种类型
  • 五.题目
    • 1.
    • 2

前言

我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,题单正在更新,其他的也会陆陆续续的更新,希望大家点赞收藏我会尽快更新的!!!

一.DFS简介

1.深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次搜尝试向更深的节点走。
2.在搜索算法中,该DFS常常指利用递归函数方便的实现暴力枚举的算法,与图论中的DFS算法有一定相似之处,但不完全相同。通常是构造一棵搜索树(或是说状态树)来搜索

二.思路

1.先定义两个数组,一个用来村饭合法解一个用来标记该数组是否被用过
2.写基于递归的深度优先搜索
3.回溯:消除搜索过程中的不同可能性之间对中间变量的影响,即搜索下一个答案之前,保证上一个答案对下一个答案没有影响
4.题目的答案可以通过搜索树/状态树枚举出来,则可以用DS

三.缺点

因为是枚举所以时间复杂度高

四.三种类型

1.DFS图论:树,图的遍历
2.基于搜索树或是状态树的枚举题目
3.基于表格搜索:本质对图的遍历

五.题目

1.

洛谷P1706 全排列问题
【算法学习之路】12.DFS_第1张图片
题解一:c++自带的全排列函数

#include  
#include 
using namespace std;
int num[10];
int main() {
	int n; cin >> n;
	for (int i = 0; i < n; i++) {
		num[i] = i + 1;
	}
	do {
		for (int i = 0; i < n; i++) {
			cout  << "    "  << num[i];
		}
		cout << endl;
	} while (next_permutation(num, num + n));

	return 0;
}

题解二:DFS

#include 
using namespace std;
int ans[15];
bool f[15];
int n;
void print() {
	for (int i = 1; i <= n; i++) {
		printf("%5d", ans[i]);
	}
	cout << endl;
}
void dfs(int k) {
	if (k > n) {
		print();
		return;
	}
	for (int i = 1; i <= n; i++) {
		if (f[i] == 0) {
			ans[k] = i;
			f[i] = 1;
			dfs(k + 1);
			f[i] = 0;
		}
	}
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		ans[i] = i;
	}
	dfs(1);

	return 0;
}

2

力扣200. 岛屿数量
【算法学习之路】12.DFS_第2张图片

class Solution {
public:
    void dfs(vector<vector<char>>& grid, int i, int j){
        int n = grid.size();
        int m = grid[0].size(); 
        grid[i][j] = '0';
        if(i-1 >= 0 && grid[i-1][j] == '1')dfs(grid,i-1,j);
        if(i+1 < n && grid[i+1][j] == '1')dfs(grid,i+1,j);
        if(j-1 >= 0 && grid[i][j-1] == '1')dfs(grid,i,j-1);
        if(j+1 < m && grid[i][j+1] == '1')dfs(grid,i,j+1);

    }
    int numIslands(vector<vector<char>>& grid) {
        int ans = 0;
        int n = grid.size();
        if(n == 0){
          return 0;
        }
        int m = grid[0].size(); 
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
              if(grid[i][j] == '1'){
                ans++;
                dfs(grid,i,j);
                }
            }
       }
       return ans;
    }
};

你可能感兴趣的:(算法学习之路,深度优先,算法,学习,c++,开发语言,数据结构,全排列)