DFS

简介: 文章目录前言一、DFS是什么?二、例题,模板1.AcWing842. 排列数字本题分析AC代码2.AcWing 843. n-皇后问题本题分析AC代码三、时间复杂度

文章目录

前言

一、DFS是什么?

二、例题,模板

1.AcWing842. 排列数字

本题分析

AC代码

2.AcWing 843. n-皇后问题

本题分析

AC代码

三、时间复杂度


前言

复习acwing算法基础课的内容,本篇为讲解基础算法:DFS,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、DFS是什么?

DFS即深度优先搜索,不同于BFS,DFS会一路走到头,然后再回溯,DFS可以搜到结果,但这个结果可能不是最优解,这个也是我们需要明确的.


二、例题,模板

1.AcWing842. 排列数字

本题链接:AcWing842. 排列数字

本博客给出本题截图:

image.png

本题分析

本题是按位填写

dfs(0);代表从第0位开始(即未开始)p数组中存的是每一位的值,s数组存的是该数是否已经填写过了,比如已经用过了i这个数,对应成代码就是s[i] = true;填写完数字之后要执行dfs(u + 1);,就是继续dfs下一位,最后记得要恢复现场s[i] = false


AC代码

#include <cstdio>
using namespace std;
const int N = 10;
int p[N], n;
bool s[N];
void dfs(int u)
{
    if (u == n)
    {
        for (int i = 0; i < n; i ++ ) 
            printf("%d ", p[i]);
        puts("");
    }
    for (int i = 1; i <= n; i ++ )
    {
        if (!s[i])
        {
            s[i] = true;
            p[u] = i;
            dfs(u + 1);
            s[i] = false;
        }
    }
}
int main()
{
    scanf ("%d", &n);
    dfs(0);
    return 0;
}

2.AcWing 843. n-皇后问题

本题链接:AcWing 843. n-皇后问题

本博客给出本题截图:

image.png

image.png

本题分析

本题需要记录:行,列,对角线,反对角线是否有元素,故需要开4个bool数组

这里我们具体来说一下对角线和反对角线的表示方法:

首先来看一下我们建立的x和y轴:

image.png

再来看对角线:

image.png

再来看反对角线:

image.png

AC代码

#include <cstdio>
using namespace std;
const int N = 20;
char g[N][N];
bool row[N], col[N], dg[N], udg[N];
int n;
void dfs(int x, int y, int s)
{
    if (y == n) x ++, y = 0;
    if (x == n)
    {
        if (s == n)
        {
            for (int i = 0; i < n; i ++ ) puts(g[i]);
            puts("");
        }
        return;                //这里注意需要加return,否则会一直dfs下去导致爆内存
    }
    dfs(x, y + 1, s);
    if (!row[x] && !col[y] && !dg[x + y] && !udg[y - x + n])
    {
        row[x] = col[y] = dg[x + y] = udg[y - x + n] = true;
        g[x][y] = 'Q';
        dfs(x, y + 1, s + 1);
        row[x] = col[y] = dg[x + y] = udg[y - x + n] = false;
        g[x][y] = '.';
    }
}
int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) 
        for (int j = 0; j < n; j ++ )
            g[i][j] = '.';
    dfs(0, 0, 0);
    return 0;
}

三、时间复杂度

关于DFS算法的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。






目录
相关文章
|
8月前
|
机器学习/深度学习 人工智能 定位技术
|
9月前
|
算法
DFS and BFS
DFS and BFS
37 0
|
11月前
DFS:生日蛋糕
DFS:生日蛋糕
|
11月前
|
定位技术
DFS:踏青
DFS:踏青
|
12月前
|
算法
DFS深度优先搜索
DFS深度优先搜索
|
算法
【和zqy学算法】Day1:DFS与BFS
【和zqy学算法】Day1:DFS与BFS
121 0
|
存储 算法 PHP
深度优先搜索(DFS)
深度优先搜索(DFS)
163 0
深度优先搜索(DFS)
dfs
题目描述 你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。 由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。 例如上图中的海域未来会变成如下样子: ....... ....... ....... ....... ....#.. ......
|
算法
迭代加深(DFS)
复习acwing算法提高课的内容,本篇为讲解算法:迭代加深,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
113 0
迭代加深(DFS)
计蒜客-1217 马走日(dfs)
马在中国象棋以日字形规则移动。
174 0