sicily1001 全排列(升序)
输入一个数字n,输出从1~n组成的数字的全排列,每个排列占一行,输出按照数值升序排列
比如输入2,则输出是:
12
21
又如输入3,则输出是:
123
132
213
231
312
321
解题思路:
1、先将第一个数字分别与自己交换和其他数字交换,然后变成 n-1个数的全排列。
2、这样n-1个数字又可以看成第一个数字与自己和其他数字交换然后变成n-2个数的全排列,以此递归。
3、当交换到第m个数字,便进行输出。
注意:这里需要升序排列,我是在交换数字时,循环向前交换,这样交换后也不改变升序了。
#include <cstdio>
#include <algorithm>
using namespace std;
int list[30020];
void perm(int k, int m)
{
int i;
if(k == m) {
for(i = 0; i <= m; i++)
printf("%d", list[i]);
printf("\n");
}
else
{
for(i = k; i <= m; i++)
{
for (int j = i-1; j >= k; j--)
swap(list[j], list[j+1]); //循环向前交换,保持升序。
perm(k + 1, m);
for (int j = k; j <= i-1; j++)
swap(list[j], list[j+1]);//将数组变回调用前样子
}
}
}
int main() {
int n, m;
scanf("%d", &n);
while (n--) {
scanf("%d", &m);
for (int i = 0; i < m; i++) {
list[i] = i + 1;
}
perm(0, m-1);
}
return 0;
}