【递归】全排列

Description

输入一个数字n,输出从1~n组成的数字的全排列,每个排列占一行,输出按照数值升序排列

比如输入2,则输出是:

12

21

又如输入3,则输出是:

123

132

213

231

312

321

Input

第一行是一个整数m,代表有m个测试用例

接下来的m行,每行是一个整数n,0 < n < 10

Output

对于每个用例,输出它的全排列,每个排列占一行,输出按照数值升序排列

Sample Input

Copy sample input to clipboard

2
2
3

Sample Output

12
21
123
132
213
231
312
321

Problem Source: 第四周 5班

 

解题思路:

QAQ之前因为最后几个不能顺序输出,老是乱位置,看了好几个博客都没大懂,直到我看到一个用字符串处理的。。。简直好用!!!!又好懂!!!!!233333

参考博客http://blog.csdn.net/jokers_i/article/details/8217063

实现代码:

#include<iostream>
#include<string>
using namespace std;

void fun(const string& sf, const string& sr) {//sf表示前部分,sr表示后部分
    if (sr.size() == 1) {
        cout << sf << sr << endl;
    } else {
        for (int i = 0; i < sr.size(); i++)
            fun(sf+sr[i], string(sr).erase(i, 1));
    }
}

int main() {
    int m, n, i;
    string sr;
    cin >> m;
    while (m--) {   //m个测例
        cin >> n;
        for (i = 0; i < n; i++)
            sr += i  + ‘1‘;    //转换成一个字符串的全排列
        fun("", sr);
        sr="";
    }
}            
时间: 2024-11-06 07:29:42

【递归】全排列的相关文章

递归全排列(C#)

递归全排列(C#): static int[] xx=new int[4]; static void Main(string[] args) { printP(4, xx, 0); } static void printP(int n,int [] A,int cur) { int i, j; if (cur == n) { for (i = 0; i < n; i++) Console.Write(A[i]); Console.WriteLine(); } else for (i = 1; i

sicily 1198. Substring (递归全排列+排序)

DescriptionDr lee cuts a string S into N pieces,s[1],…,s[N]. Now, Dr lee gives you these N sub-strings: s[1],…s[N]. There might be several possibilities that the string S could be. For example, if Dr. lee gives you three sub-strings {“a”,“ab”,”ac”},

Num 33 : 函数递归 [ 全排列 ]

数学上的全排列问题: 给定m个数,可以排列成n位数的所有情况: 例:3 个数 ( 1,2,3 ) 排列成两位数[ 含有重复数字 ]有: 11,12 ,13,21,22,23,31,32,33: 例:2个数( 1,2 ) 排列成三位数: 111, 112, 121, 122, 211, 212, 221, 222: 由上易找到规律:         对于 n 位 m 个要求的数 [ 不妨设为1,2,3的 2位数 ],我们只需从最高位开始,依次冠以第一个数( 11 );         之后保持高位

python非递归全排列

刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位置插入,生成n+1个新的全排列.因为Python切割数组或者字符串,以及合并比较方便,所以,程序会节省很多代码. 1 def getArrayInsertCharToStr(STR,CHAR): 2 arr =[] 3 s_len = len(STR) 4 index =0 5 while inde

uva 10344 23 out of 5(递归+全排列)

这道题好像不是回溯就是简单的递归,全排列一下就ok啦,晚上估计不能好好刷题了 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int cmp(const void *c,const void *d) { return *(int *)c - *(int *)d ; } int flag; int a[5];

字符串或者数字数组全排列

//字符串全排列package com.demo.acm; public class AllSortChar { public static void allSort(char[] buf,int start,int end){ if(start==end){ for(int i=0;i<=end;i++){ System.out.print(buf[i]); } System.out.println(); }else{ //多个字母全排列 for(int i=start;i<=end;i++

全排列合集

不得不佩服这位大哥,算法钻研的这么细,说的还很清楚:http://blog.csdn.net/morewindows/article/details/7370155    算法并非照着贴来的,是我看了他的说明自己写的. 去掉重复的非递归全排列: 如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"."52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数

Permutations,全排列

问题描述:给定一个数组,数字中数字不重复,求所有全排列. 算法分析:可以用交换递归法,也可以用插入法. 递归法:例如,123,先把1和1交换,然后递归全排列2和3,然后再把1和1换回来.1和2交换,全排列1和3,再把1和2交换回来.1和3交换,全排列2和1,再把1和3交换回来. 1 //递归方法 2 public List<List<Integer>> permute2(int[] num) { 3 List<List<Integer>> result =

【基础练习】codevs1294 全排列题解

惊奇的发现我竟然没写过这个 粘了黄学长的代码 因为所有的递归全排列拥有共同的灵魂 我经常犯得错误是把取消标记放到循环外 至今没开博的查查比君纠正过很多次 所以记住一定递归后马上取消标记 --水茫茫,平沙雁,旋惊散.

Java 全排列

package algorithm; public class SortAll { public static void main(String[] args) { char buf[] = {'1','2','3','4','5'}; perm(buf,0,buf.length-1); } private static void perm(char[] buf, int start, int end) { if(start==end){//当只要求对数组中一个字母进行全排列时,只要就按该数组输