递归--练习7--noi1750全排列

递归--练习7--noi1750全排列

一、心得

二、题目

1750:全排列

总时间限制: 
1000ms

内存限制: 
65536kB
描述

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有‘a‘ < ‘b‘ < ... < ‘y‘ < ‘z‘,而且给定的字符串中的字母已经按照从小到大的顺序排列。

输入
输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
输出
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:

已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。

样例输入
abc
样例输出
abc
acb
bac
bca
cab
cba

三、AC代码

 1 /*
 2 noi1750全排列
 3 //三个数组
 4 一个是原来存储基本数据的
 5 一个是储存答案的
 6 一个是做标记的
 7 还有有个数来存答案的位数的
 8 */
 9 #include <iostream>
10 #include <algorithm>
11 using namespace std;
12 int vis[10];
13 char ans[10];
14 void print(char ans[],int n){
15     for(int i=0;i<n;i++){
16         cout<<ans[i];
17     }
18     cout<<endl;
19 }
20 void f(string s,int cur){
21     int n=s.length();
22     if(cur==n) print(ans,n);
23     else{
24         for(int i=0;i<n;i++){
25             if(!vis[i]){
26                 vis[i]=1;
27                 ans[cur]=s[i];
28                 f(s,cur+1);
29                 vis[i]=0;
30             }
31         }
32     }
33
34 }
35
36 int main(){
37     string s;
38     cin>>s;
39     sort(s.begin(),s.end());
40     f(s,0);
41     return 0;
42 } 
时间: 2024-12-28 11:47:25

递归--练习7--noi1750全排列的相关文章

php 递归01 利用递归实现按字典顺序全排列

最近对递归比较感兴趣,所以开始记录一些学习过程中的递归使用方法 1.全排列函数(arrange)有两个参数一个是,需要进行全排列的字符串(假设默认是按字典顺序排列),另一个则是积累的前缀如下图: 第一次默认是'' 第二次,在for循环后分别代表1.2.3并作为下一次子递归的前缀参数 第三次,分别为12 13   21 23   31 32至此需要全排列的剩余字符串长度为一,利用echo进行输出与return结束递归 2.deal函数也有两个参数,分别是当前全排列的字符串,和去除附加在父前缀后剩下

递归写出字符串全排列

给出一个字符串,例如“abc”,输出它的全排列及“abc”,"acb","bac","bca","cab","cba". 递归的方法: 核心思想:交换. 全排列(“abc”)=a.全排列(“bc”)+b.全排列("ac")+c.全排列(“ab”),其中a.全排列(“bc”)=ab.全排列(“c”)+ac.全排列(“b”)=abc+acb void swap(char *p, char *

【递归】N位全排列

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int n; 5 int a[10]; 6 7 void search(int m) 8 { 9 10 if(m==n){ 11 printfresult(); 12 }else 13 { 14 int i; 15 for(i=m;i<n;i++) 16 { 17 swap(m,i); 18 search(m+1); 19 swap(m,i); 20 } 21 } 22 } 23 2

递归_百炼 2748 全排列

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> #include <algorithm> #include <stdlib.h> #include <vector> #include <map> #include <queue> #include <string> #include <iostream> #in

递归实现全排列python

python递归实现"abcd"字符串全排列 1.保持a不动,动bcd 2.保持b不动,动cd 3.保持c不动,动d def pailie(head="",string=""): if len(string)>1: for father_string in string: pailie(head+father_string,string.replace(father_string,"")) #关键一点:将头和尾全部传下去

字符串全排列和组合算法

打印字符串的全排列 算法的思路: 把一个字符串分成两部分,第一个字符+后面部分所有的字符.这样就能够递归的求解整个过程了: 1.每个字符都做一次首字符 2.当某个字符作为首字符的时候,求后面所有字符的全排列 而这里的求后面所有字符的全排列可以看成递归的子问题 全排列的递归树: 但是这里还有一个问题,那就是字符串中有重复的字符时,这样的算法会增加最后的结果数目.比如说字符串aab,a+ab的全排列,然后交换还是a+ab的全排列.所以会增加结果的数目.解决方案就是:当遇到重复的字符的时候就跳过去,不

枚举:全排列

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

递归深度实战

先不说理论,先来个简单的递归小例子感受一下: 字符串的反转: #include <stdio.h> //递归字符串反转 void reverse(char* s) { if( (s != NULL) && (*s != '\0') ) { reverse(s + 1); printf("%c", *s); } } int main(int argc, char *argv[]) { reverse("12345"); printf(&qu

全排列与字典序排列

首先,全排列是一个比较简单的问题,但我却没有真正的去实现过全排列. 让我独自思考全排列的话,如将 " abcd" 进行全排列,这种简单的全排列也能将我难住,因为真的没有考虑过这种问题.思考了一会,我只能给出以下比较麻烦的算法: //字符串全排列 void printRE(char* str,int index,char s[],int length){ if(index == length) printf("%s \n",str); else{ bool exsis