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

目录

  • 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.mzph.cn/news/135644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt之QAssociativeIterable】使用

介绍 QAssociativeIterable类是QVariant中一个关联式容器的可迭代接口。这个类允许多种访问在QVariant中保存的关联式容器元素的方法。如果一个QVariant可以转换为QVariantHash或QVariantMap&#xff0c;那么QAssociativeIterable的实例可以从中提取出来。 QHash<int, QSt…

软件版本控制系统VCS工具——cvs vss svn git

版本控制 版本控制系统&#xff08;Version Control System&#xff0c;VCS&#xff09;是用于跟踪和管理源代码和文档的工具。可追踪和管理修改历史&#xff0c;包括修改的内容、时间、作者等信息。有助于团队协作、追踪变更、恢复历史版本等。VCS的主要目的是帮助团队协作开…

电脑如何截屏?一起来揭晓答案!

在数字时代&#xff0c;截屏已经成为我们日常生活和工作中的必备技能。无论是为了捕捉有趣的网络瞬间&#xff0c;保存重要信息&#xff0c;还是为了协作和教育&#xff0c;电脑截屏都是一个强大而方便的工具。本文将介绍三种电脑如何截屏的方法&#xff0c;以满足各种需求&…

研发管理工具选型要考虑哪些内容?

研发管理工具选型要考虑哪些内容&#xff1f; 研发管理工具选型需要考虑六个因素&#xff0c;分别是&#xff1a;1、功能性&#xff1b;2、非功能性&#xff1b;3、易用性&#xff1b;4、产品价格&#xff1b;5、服务&#xff1b;6、厂商。其中功能性在研发管理工具选型过程中是…

精美好看又便于分享的电子相册制作,谁看了不心动呢?

很多人都喜欢用相机记录生活中的点点滴滴&#xff0c;可是当要分享到朋友圈的时候&#xff0c;觉得这张也好看&#xff0c;那张也不错&#xff0c;如果全部分享出去就霸屏了&#xff0c;然后就不知道怎么选择了。其实&#xff0c;我们可以把这些照片做成电子相册&#xff0c;然…

手机是否能登陆国际腾讯云服务器?

在当今社会&#xff0c;跟着互联网的开展&#xff0c;越来越多的用户开始运用云服务器来存储和处理数据。其间&#xff0c;腾讯云服务器作为国内知名的云服务器供给商&#xff0c;受到了广大用户的欢迎。可是&#xff0c;有一些用户可能还不清楚手机是否能登陆腾讯云服务器。本…

docker可视化

什么是portainer&#xff1f; portainer就是docker图形化界面的管理工具&#xff0c;提供一个后台面板供我们操作 目前先用portainer(先用这个)&#xff0c;以后还会用到Rancher(CI/CD在用) 1.下载portainer 9000是内网端口&#xff0c;8088是外网访问端口 docker run…

对话凯文·凯利:AI 会取代人的 90% 技能,并放大剩余的 10%

采访 | 邹欣&#xff0c;CSDN 副总裁 作者 | 王启隆 责编 | 唐小引 出品 | 《新程序员》编辑部 5000 天后&#xff0c;你都会做些什么&#xff1f; 是和 AI 助手一起编程&#xff0c;还是让生活完全由 AI 掌控&#xff0c;自己坐享其成&#xff1f;如果到时候还要上班&a…

GFLAGS中cmakeLists的编写-OsqpEigen中cmakeLists的编写---GLOG移植

1 glog 使用 CMakeLists.txt 来组织和构建包含 glog 的项目是一个很好的选择。下面是一个如何使用 CMake 与 glog 的例子。 项目结构: ├── CMakeLists.txt └── main.cppCMakeLists.txt: cmake_minimum_required(VERSION 3.10) project(GlogExample)# 设置C++标准为C++11…

采购劳保鞋如何选择合适的尺码

今天在某问答平台看到了这么一个话题&#xff0c;平常皮鞋穿40码&#xff0c;运动鞋穿41码&#xff0c;劳保鞋如何选择合适的尺码&#xff1f;小编发现很多朋友在选购劳保鞋的时候&#xff0c;对劳保鞋的尺码了解不是很清楚都会在这一块纠结。选择鞋子脚感舒适很重要&#xff0…

射频功率放大器应用中GaN HEMT的表面电势模型

标题&#xff1a;A surface-potential based model for GaN HEMTs in RF power amplifier applications 来源&#xff1a;IEEE IEDM 2010 本文中的任何第一人称都为论文的直译 摘要&#xff1a;我们提出了第一个基于表面电位的射频GaN HEMTs紧凑模型&#xff0c;并将我们的工…

使用angr自动利用简单缓冲区溢出漏洞-insomnihack_aeg

题目来源于angr_ctf&#xff0c;c代码很简单。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h>char component_name[128] {0};typedef struct component {char name[32];int (*do_so…

如何在Linux上搭建本地Docker Registry并实现远程连接

Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…

C# OpenCvSharp 通过特征点匹配图片

SIFT匹配 SURF匹配 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text.RegularExpressions; using System.Windows.Forms; using static System.Net…

企业防范数据安全的重要性与策略

随着信息技术的快速发展&#xff0c;企业的数据安全问题日益凸显。数据安全不仅关乎企业的商业机密&#xff0c;还涉及到客户的隐私和信任。因此&#xff0c;企业必须采取有效的防范措施&#xff0c;确保数据安全。本文将探讨企业防范数据安全的重要性&#xff0c;并介绍一些实…

elementUI的el-menu组件做内部组件和外链区分

场景&#xff1a;左侧菜单栏的菜单项有内部组件切换&#xff0c;也会有点击后进入外链的情况&#xff0c;如何同时处理这种情况&#xff1f; 解决思路&#xff1a; 在路由配置中path代表组件切换路径或者外链配置el-menu-item显示菜单项时&#xff0c;使用动态路由形式&#…

【ARM Coresight OpenOCD 系列 1 -- OpenOCD 介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 1.1 OpenOCD 介绍1.1.1 OpenOCD 支持的JTAG 适配器1.1.2 OpenOCD 支持的调试设备1.1.3 OpenOCD 支持的 Flash 驱动 1.2 OpenOCD 安装与使用1.2.1 OpenOCD 代码获取及安装1.2.2 OpenOCD 使用1.2.3 OpenOCD 启用 GDB…

Vim基本使用操作

前言&#xff1a;作者也是初学Linux&#xff0c;可能总结的还不是很到位 Linux修炼功法&#xff1a;初阶功法 ♈️今日夜电波&#xff1a;美人鱼—林俊杰 0:21━━━━━━️&#x1f49f;──────── 4:14 …

9 网关的作用

1、总结&#xff1a; 1.如果离开本局域网&#xff0c;就需要经过网关&#xff0c;网关是路由器的一个网口。 2.路由器是一个三层设备&#xff0c;里面有如何寻找下一跳的规则 3.经过路由器之后 MAC 头要变&#xff0c;如果 IP 不变&#xff0c;相当于不换护照的欧洲旅游&#…

DAY13 链表

数组 静态数组 例子 : int nums[5] {0}; struct person ps[5]; 缺点 : 1,无法修改地址 2,无法动态定义长度 3,占用内存过大或过小 4,增删速度慢 优点 数组的内存是连续开辟的, 所以读取速度快 动态数组 例子 : int *nums (int *) calloc(5,sizeof(int)); struct …