G:全排列
-
总Time Limit:
- 1000ms Memory Limit:
- 65536kB
-
Description
-
对于数组[1, 2, 3],他们按照从小到大的全排列是
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
现在给你一个正整数n,n小于8,输出数组[1, 2, …,n]的从小到大的全排列。
Input
- 输入有多行,每行一个整数。当输入0时结束输入。 Output
- 对于每组输入,输出该组的全排列。每一行是一种可能的排列,共n个整数,每个整数用一个空格隔开,每行末尾没有空格。 Sample Input
-
230
Sample Output
-
1 2
2 1
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
题目大意: 主要是给出一个数n 现在要求你求出 1-- n 的数的全排列
解题方法: 你有很多总解法 也可以用 STL 中的全排列函数进行求解
-
这个题是辽宁大学的寒假训练题。。。。。
-
#include<iostream> #include<algorithm> using namespace std; #define N 1000 int main() { int n, i; int a[N]; while(cin>>n) { if(n == 0) { return 0; } for(i = 1 ; i < n; i++) { a[i] = i ; cout<<i<<" "; } a[n] = n; cout<<n<<endl; while(next_permutation(a+1, a+n+1)) { for(i = 1 ; i < n; i++) { cout<<a[i]<<" "; } cout<<a[n]<<endl; } } return 0; }
-
下面给出一种递归方式的解答全排列的解法:
-
解法思路 :
-
A B C
-
i= 1和 j = i;j <= n 进行交换还是 A B C j = 2 B A C j = 3 C A B
-
i = 2 A B C A C B j = 2 B A C ;B C A ;j = 3 C A B ; C B A //这个就是最后结果, 也就是算法的原理
-
源代码:
-
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define Max 10000 void swap(char *a , char *b) {//下面的交换更加正规 char tmp ; tmp = *a; *a = *b; *b = tmp ; } void permute(char *a, int i, int n) { //三个参量 分别表示 数组和 第i个字符 if(i == n ) { printf("%s\n", a); //输出字符串 } else { for(int j = i; j <= n; j++) { swap((a+i),(a+j)); //进行交换 permute(a, i+1,n); swap((a+i),(a+j)); //将其进行交换回来 } } } int main() { //下面是主函数 char str[Max]; while(scanf("%s", str) != EOF) { int len = strlen(str); permute(str, 0, len-1) ; } return 0; }