数的排列问题

突然想到一个问题,对于给定的几个数怎样用程序把所有的数的排列全部输出呢

查了一下运用的思想是这样的

其实这个和深度优先搜索很像

把数组分成两个部分下标0~s为排好的,s~e为没有排的

对数的操作从s开始

1 void sort(vector<int> &nums,int s,int e){
2      for(int i = s ; i<e ;++i){
3           swap(nums,s,i);
4           sort(nums,s+1,e);       }
7 }

对于上图的同一列,先s和s交换(相等,实质没有,但是不能省略,它仅代表当前这一层不交换位置),然后s和s+1交..........依次往后

然而每交换一次都会进入下一层,sort(nums,s+1,e)

那么递归的出口就是s和e相等

void sort(vector<int> &nums,int s,int e){
      if(s<e)
      for(int i = s ; i<e ;++i){
           swap(nums,s,i);
           sort(nums,s+1,e);
      }
}

那对如果打印出来呢,在每一个分支到达最深时进行打印

void sort(vector<int> &nums,int s,int e){
      if(s==e){
         for(int i =0;i<nums.size();++i){
            cout<<nums[i]<<" ";
        }
        cout<<endl;
      }else{
         for(int i = s ; i<e ;++i){
              swap(nums,s,i);
              sort(nums,s+1,e);
         }
      }
}

那么每一支到达最深时顺序都被打乱了,别的分支怎么办呢,那就要在回溯的时候把之前交换的数交换回来

void sort(vector<int> &nums,int s,int e){
      if(s==e){
         for(int i =0;i<nums.size();++i){
            cout<<nums[i]<<" ";
        }
        cout<<endl;
      }else{
         for(int i = s ; i<e ;++i){
              swap(nums,s,i);
              sort(nums,s+1,e);
              swap(nums,s,i);
         }
      }
}

每当递归退出一层的时候都会把之前换的再交换一次,相当于换了回来

参考:http://blog.csdn.net/jfcat/article/details/8785865

时间: 2024-11-05 20:37:23

数的排列问题的相关文章

有环积分号的单行数式排列规则

使用MathType的用户大部分都知道,有环积分中的积分函数式需要排在两个积分号的居中位置.但是在操作过程中一些用户还不是很了解,本教程将详解有环积分的单行数式排列规则.有环积分样式如下: 在这个数式中,积分函数式“T(m) nk…”.“R(x)+Q(y)”应与“=”对齐,排在两个积分号的居中位置,不能与底线平齐.下面的排法是不正确的: 积分号上下限原则上应该排在它的上面和下面,一般用七号字.如: 在格式上,当上下限在积分号上面和下面时,不能排在上和下的居中位置,而是上限偏右,下限偏左.但如果只

P1384 幸运数与排列

P1384 幸运数与排列 神奇的(逆)康托展开:求1到n的全排列中字典序第k小的排列 $k<=10^9<13!$,显然$k$最多只会影响后$13$位 前面一大串都是有序从小到大排列的,于是搞个数位dp 后面一小串用逆康托展开求出原串,枚举是否符合条件. #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> u

蓝桥杯 2014本科C++ B组 六角填数 枚举排列

标题:六角填数 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填写多余的内容. 简单的枚举排列,只要提前将12个结点标号,来判断六个线段总和是否相等. 代码如下: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define MAXN 13 5 int num

HDU 4045 Machine scheduling (组合数学-斯特林数,组合数学-排列组合)

Machine scheduling Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1000    Accepted Submission(s): 363 Problem Description A Baidu's engineer needs to analyze and process large amount of data o

Binary Lexicographic Sequence URAL - 1081 (有关数的排列)

1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 #include<map> 5 #include<set> 6 #include<string> 7 using namespace std; 8 typedef unsigned long long LL; 9 const int maxn = 46; 10 LL dp[maxn][2]; 11 12 vo

HDU 4372 Count the Buildings(组合数学-斯特林数,组合数学-排列组合)

Count the Buildings Problem Description There are N buildings standing in a straight line in the City, numbered from 1 to N. The heights of all the buildings are distinct and between 1 and N. You can see F buildings when you standing in front of the

bzoj 3505 [Cqoi2014]数三角形——排列组合

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3505 好题!一定要经常回顾! 那个 一条斜线上的点的个数是其两端点横坐标之差和纵坐标之差的gcd-1 真是很妙. https://blog.csdn.net/u012288458/article/details/48624859 https://www.cnblogs.com/Var123/p/5377616.html 然而还可以递推?https://www.cnblogs.com/liu

ACM 求全排列(字典序、邻位对换、递增进位制数,递减进位制数)

字典序:(联合康托展开就也可以按照中介数求) 邻位对换.递增进位制数,递减进位制数:具体的实现和算法讲解如下: 代码..C++版的实现并不好..因为是挨个向后找的,如果K很大的时候会超时,不过...思路是这样...,第二版C++没有完成...因为不想写了,思路很简单,一次加减K就可以了 python代码直接给出,很完美 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<algo

1001 数组中和等于K的数对

1001 数组中和等于K的数对 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对.例如K = 8,数组A:{-1,6,5,3,4,2,9,0,8},所有和等于8的数对包括(-1,9),(0,8),(2,6),(3,5). Input 第1行:用空格隔开的2个数,K N,N为A数组的长度.(2 <= N <= 50000,-10^9 <= K <= 10^9)