洛谷-P1706 全排列问题(DFS)

news/2024/7/20 21:07:40 标签: 深度优先, 算法, c++, 蓝桥杯, 学习

目录

题目链接:

思路:

代码:


题目链接:

P1706 全排列问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)


思路:

      如果n比较小,可以写n个for循环输出全排列。但是这种简单方法只能用于较小的n,如果n比较大,这种方法的代码非常冗长、难看。
  DFS非常适合实现全排列,代码清晰、简洁、优美。下面的C++代码能从小到大打印排列。

源自罗老师的博客:<蓝桥杯软件赛>零基础备赛20周--第12周--DFS基础(必考)-CSDN博客

可以画二叉树来帮助理解。


代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int vis[10];    // 访问标记
int a[10];      //需要做全排列的数组
int b[10];      //当前DFS得到的全排列
void dfs(int step) {
    if (step == n+1) {     //已经对n个数做了全排列,输出全排列
        for (int i=1; i<=n; i++){
        	  printf("%5d",b[i]);
		}
        printf("\n");   //调试了才知道为什么这么写输出三个数字后换行,退出,然后进入下面那个遍历a[i]的for循环中
        return;            //结束,不再继续DFS
    }
    for (int i = 1; i <= n; i++) {    //遍历每个a[i],放进全排列中
        if (vis[i] == 0) {   // 数字a[i]不在前面得到的排列中
            b[step] = a[i];  // 把a[i]放进排列
            vis[i] = 1;      // 保存现场:a[i]不能在后面继续用
            dfs(step+1);     // 继续把后面的数放进排列
            vis[i] = 0;      // 恢复现场:a[i]重新可以使用
        }
    }
    return;
}
int main() {
    cin >> n;
    for (int i=1; i<=n; i++)  a[i]=i;   //赋值得到n个数
    dfs(1);  //对a[1]~a[n]做全排列
    return 0;
}

 输出部分排列

  上述代码是打印n个数的全排列,如果需要打印n个数中任意m个数的排列,略作修改即可。例如n=4,m=3,修改C++代码这两处:第8行把step=n+1改为step=m+1,第9行i<=n改为i<=m。

 源自罗老师的博客:<蓝桥杯软件赛>零基础备赛20周--第12周--DFS基础(必考)-CSDN博客


多调试,了解计算机走的每一步。


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

相关文章

全面理解UDP协议

UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是计算机网络中传输层的一种无连接协议&#xff0c;位于IP协议之上&#xff0c;提供一种快速、高效、简单但相对不可靠的数据传输方式。相比于TCP&#xff08;传输控制协议&#xff09;&#xff0…

常用运动模型

运动模型 常用运动模型: CV、CA、CTRV、CTRV、CTRA、CSAV和CCA/CSAA模型微分多项式模型辛格模型半马尔科夫模型机动目标"当前模型"二维转弯运动模型三维模型比列导引模型 恒定速度模型&#xff08;Constant Velocity, CV&#xff09; 恒定加速度模型&#xff08;C…

初阶数据结构—算法的时间复杂度和空间复杂度

第一章&#xff1a;数据结构前言&#xff08;Lesson 1&#xff09; 1. 什么是数据结构&#xff1f; 数据结构 (Data Structure) 是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的 数据元素的集合。 2. 什么是算法&#xff1f; 算法(Algorithm)…

【网络安全】常见的网站攻击方式及危害

常见的网站攻击方式多种多样&#xff0c;每一种都有其独特的特点和危害。以下是一些常见的网站攻击方式&#xff1a; 跨站脚本攻击&#xff08;XSS&#xff09;&#xff1a;攻击者通过在目标网站上注入恶意脚本&#xff0c;当用户浏览该网站时&#xff0c;恶意脚本会在用户的浏…

NetCore通过中间件判断接口是否存在 AllowAnonymousAttribute 特性

.NET Core中&#xff0c;可以通过检查接口上的AllowAnonymous特性来判断一个接口是否被标记为允许匿名访问。以下是一个简单的中间件示例&#xff0c;用于在请求管道中检查接口是否被AllowAnonymous标记&#xff1a; public class AllowAnonymousMiddleware {private readonly…

python ---- %r %s格式输出的区别

在python中&#xff0c; % s和 % r是我们常用的格式符&#xff0c;它们的用法基本一致&#xff0c;但作用却不尽相同&#xff0c;下面简要说明一下两者的区别&#xff1a; 1. % s是将对象 / 变量传递到str()方法中&#xff0c;并将其转化为面向用户的可阅读的格式。 2. % r是将…

《QT实用小工具·七》CPU内存显示控件

1、概述 源码放在文章末尾 CPU内存显示控件 项目包含的功能如下&#xff1a; 实时显示当前CPU占用率。实时显示内存使用情况。包括共多少内存、已使用多少内存。全平台通用&#xff0c;包括windows、linux、ARM。发出信号通知占用率和内存使用情况等&#xff0c;以便自行显示…

OpenCV项目实战-深度学习去阴影-图像去阴影

往期热门博客项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 //正文开始&#xff01; 图…