5-全排列总结:

https://www.nowcoder.com/acm/contest/76/H

给一道题,可以去测试代码。

这里总结一下全排列的几种方法:

方法一:利用交换排列:缺点:不能按字典序排列,但可以借助set处理。

#include <bits/stdc++.h>  //不会按字典序排列 
using namespace std;void pre(string str, int s, int e){if(s == e){cout << str << endl;}else{for(int i = s; i <= e; i++){if(i != s && str[i] == str[s]) //去重,除了第一位,其余的相同时无须交换 continue;swap(str[i], str[s]);pre(str, s + 1, e);swap(str[i], str[s]);}}
}int main(){string str;cin >> str;pre(str, 0, str.length() - 1);return 0;
}

  方法二:利用dfs,只能处理没有重复元素的字符串

#include <bits/stdc++.h>
using namespace std;
char str[100];
char mu[100];void dfs(int len, int n){if(len == n){cout << mu << endl;return ;}for(int i = 0; i < n; i++){ //尝试放入每个字符 int flag = 1;for(int j = 0; j < len; j++){ //检测这个字符是否已经放入过 if(mu[j] == str[i]){flag = 0;break;}}if(flag){mu[len] = str[i];dfs(len + 1, n); }}
}int main(){cin >> str;sort(str, str + strlen(str)); dfs(0, strlen(str));return 0;
}

  方法三:dfs: 感觉这个是比较理想的,可以按字典序排好输出,并能去重,一定要掌握!!!

对于A1,B,A2进行排序,(这里的A1, A2代表相同元素,下标是为了区分)
首先sort一下变成:A1,A2,B
然后第一趟:
A1,A2,B
A1, B, A2
然后遍历到A2开头了,好,后面查找下一个时,从i=0开始,
于是判断A1是否访问过,未访问则进行最关键的步骤了:
检测A1之后是否有已访问的且和A1相等,如若是则放弃A1继续遍历。
这里有点不好理解,对于A1A2B的序列,可知A1再前所以以A开头的
必定是以A1开头,所以在尝试A2开始头时,遍历尝试放入第二个元
素时判断A1虽然当前未访问过,但他是在A2之前,一定在之前的全
排列之中了,故放弃。
感觉还是不太好理解;还是自己在纸上画画,模拟一下,多体会体会。

 

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3;
char str[N];
char buf[N]; 
int toal, len;
bool visit[N];void pre(int num){if(num == len){cout << buf << endl;toal++;return ;}for(int i = 0; i < len; i++){if(!visit[i]){bool flag = 1;for(int j = i + 1; j < len; j++){if(visit[j] && str[j] == str[i]){ //检测重复 flag = 0;break;}}if(flag){buf[num] = str[i]; //这里不能写成:buf[num++] = str[i];因为for循环没有结束还要用num,不能改变num的值 visit[i] = 1;pre(num + 1); visit[i] = 0;}}}
}int main(){cin >> str;len = strlen(str);sort(str, str + len);pre(0);cout << "toal: " << toal << endl;return 0;
}

 

  

 

转载于:https://www.cnblogs.com/zhumengdexiaobai/p/8530605.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466505.shtml

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

相关文章

大大大大数怎么求余?C语言

问题&#xff1a;一个特别大的数除以23求余数用C语言应该怎么算啊&#xff1f;比如23232323232323232323232323232323232323232323232323232323233除以23&#xff0c;怎么算余数&#xff1f;数据类型在计算机的存储是有大小限制的&#xff0c;所以才出现了大数求余这种问题&…

substr

substr &#xff08;C语言函数&#xff09; 编辑 substr是C语言函数&#xff0c;主要功能是复制子字符串&#xff0c;要求从指定位置开始&#xff0c;并具有指定的长度。如果没有指定长度_Count或_Count_Off超出了源字符串的长度&#xff0c;则子字符串将延续到源字符串的结尾…

***站长自述挂马经历 提醒挂马者回头是岸

我做站都已经接近三年了&#xff0c;期间像很多人一样买过很多玉米&#xff0c;但是因为养不起&#xff0c;至今只保留了一个域名&#xff08;159e.cn&#xff09; &#xff0c;当时学校正流行移动159的号码&#xff0c;然后e在网络上代表很多意思&#xff0c;就注册了这个域名…

微信公众号--相关资料

相关资料 l 官方文档&#xff1a;https://mp.weixin.qq.com/wiki?tresource/res_main&idmp1445241432 l 测试号&#xff1a;https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?actionshowinfo&tsandbox/index l 接口调试地址&#xff1a;https://mp.weixin.qq.…

程序员因拒绝带电脑回家工作被开除!获赔19.4万元

近日&#xff0c;男子拒绝春节带电脑回家工作被开除的消息&#xff0c;成为了不少网友关注的焦点&#xff0c;引发网友共鸣。因为春节拒绝带工作电脑回家被开除&#xff0c;上海一位软件工程师起诉公司获赔19.4万元。2月2日&#xff0c;据上海浦东法院公众号消息&#xff0c;该…

键值键名

在注册表中 所谓的键&#xff0c;是指一个注册表条目。 键名&#xff0c;是这个条目的名称 键值是为这个条目所赋予的值。 比如&#xff1a; NoDesktop1 这就是一个键 NoDesktop是一个键名 1就是一个键值 这个条目的意思是说&#xff1a;NoDesktop是没有桌面当值为1的时候&…

随便写写(5)

也许是今年发生的事情太多了&#xff0c;所以比以前要更关注时事&#xff0c;虽然面对一些既成的事实&#xff0c;难免要进行痛心的思考。 昨天晚上关注了一下东方卫视播出的9.8特大尾矿库溃坝事故的后续报道&#xff0c;这起特大人为事故已经得到了认定&#xff0c;相关的责任…

STM32 LED灯的另一种写法

STM32 LED灯的另一种写法 #ifndef __BSP_LED_ #define __BSP_LED_#include <MM32x103.h> // 这个换成STM32的库文件就行 #include "type.h"// #define LED1_RUN_GRP GPIOC #define LED1_RUN_IDX GPIO_Pin_6 #define LED1_RUN_OFF() GPIO_ResetBit…

C# 获取枚举的描述属性

https://www.cnblogs.com/TanSea/p/6923743.html 转载于:https://www.cnblogs.com/niuniu0108/p/8532161.html

利用C语言中的setjmp和longjmp,来实现异常捕获和协程

一、前言二、函数语法介绍与 goto 语句比较与 fork 函数比较与 Python 语言中的 yield/resume 比较三、利用 setjmp/longjmp 实现异常捕获四、利用 setjmp/longjmp 实现协程五、总结一、前言 在 C 标准库中&#xff0c;有两个威力很猛的函数&#xff1a;setjmp 和 longjmp&…

VS2010

https://jingyan.baidu.com/article/d5a880eb74824013f147cca4.html

1、如何理解SQL Server的实例

在项目实施过程中&#xff0c;不少用户会有这样的需求&#xff1a;要求开发一套基于SQL Server的新系统&#xff0c;这套系统验收通过后&#xff0c;要和一个原有的SQL Server系统合并&#xff0c;共用一个服务器&#xff0c;所以不能为新系统提供单独的服务器&#xff08;资金…

centos6.9系列LNMP环境的安装

一、Nginx 1.先解决Nginx的依赖关系&#xff1a; yum install -y pcre-devel openssl-devel 2.安装wget&#xff1a;sudo yum -y install wget 3.下载nginx的安装包&#xff1a;wget http://nginx.org/download/nginx-1.10.3.tar.gz 4.解压nginx文件包&#xff1a;tar xf nginx…

MDK临界区

Keil临界区/********************************************************************************************************* ** Function name: __ENTER_CIRTICAL, __EXIT_CIRTICAL ** Descriptions: 临界区代码保护宏 ** input parameters: 返回…

Linux 修改 ELF 解决 glibc 兼容性问题

转自&#xff1a;Soul Of Free Loophttps://zohead.com/archives/mod-elf-glibc/Linux glibc 问题相信有不少 Linux 用户都碰到过运行第三方&#xff08;非系统自带软件源&#xff09;发布的程序时的 glibc 兼容性问题&#xff0c;这一般是由于当前 Linux 系统上的 GNU C 库&am…

VS2010创建ATL工程及使用C++测试COM组件

VS2010创建ATL工程及使用C测试COM组件 1.创建ATL项目&#xff0c;取名MyCom 2. ATL 项目向导&#xff0c;勾选 【支持COM 1.0】和【支持部件注册器】&#xff0c;其他默认&#xff0c;点击完成。 3.在该项目中添加类 4.添加一个ATL简单对象 5. ATL 简单对象向导&#xff0c…

基于气动人工肌肉的双足机器人关节设计

介绍了一种由气动人工肌肉构建的双足机器人关节&#xff0c;该关节利用气动人工肌肉的柔性特性&#xff0c;可以有效控制双足机器人快速行走或跑步时的落地脚冲击问题。   详细给出了气动人工肌肉的工作原理以及由其构成的关节系统的硬件架构。同时介绍了基于此硬件关节搭建的…

函数内置方法

abs&#xff08;&#xff09; 取绝对值 dict&#xff08;&#xff09; 数据转为字典 help&#xff08;&#xff09; 帮助 min&#xff08;&#xff09; 取最小值 max&#xff08;&#xff09; 取最大值 setattr&#xff08;&#xff09;未讲 all&#xff08;&#xff09; 判断…

芯片IC附近为啥要放0.1uF的电容?看完秒懂~

数字电路要运行稳定可靠&#xff0c;电源一定要”干净“&#xff0c;并且能量补充一定要及时&#xff0c;也就是滤波去耦一定要好。什么是滤波去耦&#xff0c;简单的说就是在芯片不需要电流的时候存储能量&#xff0c;在需要电流的时候又能及时地补充能量。有读者看到这里会说…

ATL

https://blog.csdn.net/pigautumn/article/details/43021085 https://www.cnblogs.com/chechen/p/8119018.html