acwing算法基础之搜索与图论--DFS

news/2024/7/20 22:35:30 标签: 深度优先, 算法, 图论

目录

  • 1 基础知识
  • 2 模板
  • 3 工程化

1 基础知识

调用dfs()之后表示已经走到头了,需要往回走了(即,回溯),那这时候就要恢复成调用dfs()之前的模样(即,恢复现场)。

不同的搜索顺序,对应着不同的耗时。

2 模板

题目1:输出1,2,3,…,n的全排列,按照字典序输出。

#include <iostream>

using namespace std;

const int N = 10;

int path[N];
bool st[N];

int n;

void dfs(int u) {//第u位填什么
    if (u == n) {
        for (int i = 0; i < u; ++i) {
            cout << path[i] << " ";
        }
        cout << endl;
    }
    
    for (int i = 1; i <= n; ++i) {
        if (!st[i]) {
            path[u] = i;
            st[i] = true;
            dfs(u+1);
            st[i] = false;
        }
    }
    
    return;
}

int main() {
    cin >> n;
    
    dfs(0);
    return 0;
}

题目2:从1,2,3,…,n中选择m个数,考虑选择的数的顺序(即,这是一个排列问题),请按照字典序输出。

#include <iostream>

using namespace std;

const int N = 10;

int path[N];
bool st[N];

int n, m;

void dfs(int u) {//第u位填什么
    if (u == m) {
        for (int i = 0; i < u; ++i) {
            cout << path[i] << " ";
        }
        cout << endl;
    }
    
    for (int i = 1; i <= n; ++i) {
        if (!st[i]) {
            path[u] = i;
            st[i] = true;
            dfs(u+1);
            st[i] = false;                
        }
    }
    
    return;
}

int main() {
    cin >> n >> m;
    
    dfs(0);
    return 0;
}

题目3:从1,2,3,…,n中选择m个数,不考虑选择的数的顺序(即,这是一个组合问题)。

#include <iostream>

using namespace std;

const int N = 10;

int path[N];
bool st[N];

int n, m;

void dfs(int u) {//第u位填什么
    if (u == m) {
        for (int i = 0; i < u; ++i) {
            cout << path[i] << " ";
        }
        cout << endl;
    }
    
    for (int i = 1; i <= n; ++i) {
        if (!st[i]) {
            path[u] = i;
            if (u == 0 || path[u-1] < path[u]) {
                st[i] = true;
                dfs(u+1);
                st[i] = false;                
            }
        }
    }
    
    return;
}

int main() {
    cin >> n >> m;
    
    dfs(0);
    return 0;
}

题目4:将n个皇后放在n*n的棋盘上,使得n个皇后不能互相攻击到。横、竖、斜线、反斜线。

dfs()方式1:

#include <iostream>

using namespace std;

const int N = 20;
char g[N][N];
int col[N], dg[N], udg[N];
int n;

void dfs(int u) {
    if (u == n) {
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                cout << g[i][j];
            }
            cout << endl;
        }
        cout << endl;
    }
    
    for (int i = 0; i < n; ++i) { //把Q填入到(u,i)位置处
        if (!col[i] && !dg[u+i] && !udg[n-u+i]) {
            g[u][i] = 'Q';
            col[i] = dg[u+i] = udg[n-u+i] = true;
            dfs(u+1);
            g[u][i] = '.';
            col[i] = dg[u+i] = udg[n-u+i] = false;
        }
    }
    return;
}

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            g[i][j] = '.';
        }
    }
    
    dfs(0);
    
    return 0;
}

dfs()方式2:

#include <iostream>

using namespace std;

const int N = 20;
char g[N][N];
int row[N], col[N], dg[N], udg[N];
int n;

void dfs(int x, int y, int s) {
    if (y == n) {
        y = 0;
        x++;
    }
    
    if (x == n) {
        if (s == n) { //如果有n个皇后,则输出此方案
            for (int i = 0; i < n; ++i) {
                cout << g[i] << endl;
            }
            cout << endl;
        }
        return;
    }
    
    //(x,y)不放皇后
    dfs(x, y + 1, s);
    
    //(x,y)可能放皇后
    if (!row[x] && !col[y] && !dg[x+y] && !udg[x-y+n]) {
        g[x][y] = 'Q';
        row[x] = col[y] = dg[x+y] = udg[x-y+n] = true;
        dfs(x, y + 1, s + 1);
        row[x] = col[y] = dg[x+y] = udg[x-y+n] = false;
        g[x][y] = '.';
    }
    
    return;
}

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            g[i][j] = '.';
        }
    }
    
    dfs(0, 0, 0);
    
    return 0;
}

3 工程化

暂无。。。


http://www.niftyadmin.cn/n/5162613.html

相关文章

算法竞赛——数论(一),数论内容的介绍,基础数论

文章目录 一&#xff0c; 数论学习路线的介绍和相关建议1&#xff0c;建议学习人群 &#xff1a;2&#xff0c;建议学习时长3&#xff0c;学习路线的介绍1&#xff0c;基础数论2&#xff0c;组合数学3&#xff0c;计算几何 二&#xff0c;基础数论第一部分 —— 快速幂和快速幂…

每天都很煎熬,领导派的活太难,真的想跑路了

人在江湖身不由己&#xff0c;无论是领导的亲信还是团队的边缘&#xff0c;都可能遇到这种情况———不得不干一件特别难以推进的事情&#xff0c;茫然无措&#xff0c;不知如何推进。每天陷入焦虑和自我怀疑中…… 这种事情一般有一些共同特点。 结果和目标极其模糊。需要协…

设计模式—结构型模式之装饰器模式

设计模式—结构型模式之装饰器模式 适配器是连接两个类&#xff0c;可以增强一个类&#xff0c;装饰器是增强一个类。 向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。属于对象结构型模式。 创建了一个装饰类&#xff0c;用来包装原有的类&#xff0c;并在保…

Mysql5.7二级等保配置项示例

一、Mysql5.7的配置文件my.ini配置示例 [mysql] #设置mysql客户端默认字符集 default-character-setutf8 [mysqld] #设置mysql端口号&#xff0c;调整为非默认端口3306 port 3807 #设置为mysql的程序安装目录 basedir"C:\Program Files\MySQL\MySQL Server 5.7\" #…

PSP - 蛋白质与核酸(RNA\DNA)复合物结构预测 RoseTTAFoldNA 算法框架

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134208615 Paper: Accurate prediction of nucleic acid and protein-nucleic acid complexes using RoseTTAFoldNA GitHub: RoseTTAFold2NA 蛋白…

【微软技术栈】C#.NET 中的正则表达式最佳做法

本文内容 考虑输入源适当处理对象实例化控制回溯使用超时值只在必要时捕获 .NET 中的正则表达式引擎是一种功能强大而齐全的工具&#xff0c;它基于模式匹配&#xff08;而不是比较和匹配文本&#xff09;来处理文本。 在大多数情况下&#xff0c;它可以快速、高效地执行模式…

2023-11-Rust

学习方案&#xff1a;Rust程序设计指南 1、变量和可变性 声明变量&#xff1a;let 变量、const 常量 rust 默认变量一旦声明&#xff0c;就不可变(immutable)。当想改变 加 mut&#xff08;mutable&#xff09; 。 const 不允许用mut &#xff0c;只能声明常量&#xff0c;…

解决Docker启动之npm版本不兼容问题

报错内容&#xff1a; npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion1, but package-lock.json was generated for lockfileVersion2. Ill try to do my best with it! npm WARN tar ENOENT: no such file or directory, open /home/wvp-…