习题2.8 输出全排列(20 分)
2018-01-03 11:03
417 查看
习题2.8 输出全排列(20 分)
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a1,a2,⋯,an排在序列b1,b2,⋯,bn之前,如果存在k使得a1=b1,⋯,ak=bk 并且 ak+1<bk+1。
输入样例:
3
输出样例:
123132
213231
312
321
#include <stdio.h> #include <stdlib.h> typedef int ElementType; void quicksort( ElementType A[], int l, int r); void swapElement(ElementType *a, ElementType *b); void dictPrem(ElementType ary[], int len); void showarray(ElementType a[], int len); void swapElement(ElementType *a, ElementType *b) { ElementType temp = 0; temp = *a; *a = *b; *b = temp; } void quicksort( ElementType A[], int l, int r) { ElementType tmp; int i, j; if(l < r) { i = l; j = r; tmp = A[i]; while(i < j) { while(A[j]>tmp && i<j) //一定要i<j,因为下面j--改变了j的值,没有这个判定,无法跳过A[j]大于tmp不用改变j值的情况 j--; //由右往左寻找,遇到A[j]>tmp则跳过,寻找下一个 if(i<j) { A[i] = A[j]; i++; } while(A[i]<tmp && i<j) //改变这里的A[i]<tmp小于的符号,同时改变42行A[j]>tmp的大于符号,可以改为由大到小排列 i++; if(i<j) { A[j] = A[i]; j--; } //showarray(A, r+1); //printf("\n***************************\n"); } /**< 如果r == l,下面的语句不会执行,这也是迭代停止的条件 */ A[i] = tmp; quicksort(A, l, i-1); quicksort(A, i+1, r); } } void showarray(ElementType a[], int len) { int j; for(j=0; j<len; j++) { printf("%d ", a[j]); } printf("\n"); } void dictPrem(ElementType ary[], int len) { int cnt, i, j, a, b; for(i=1, cnt=1; i<=len; i++) { cnt *= i; } while(cnt--) { showarray( ary, len); for(i=len-1; i>0; i--) { if(ary[i-1]<ary[i]) { a = i-1; //printf("a=%d\t", a); break; } } for(i=len-1; i>a; i--) { if(ary[i]>ary[a]) { b = i; //printf("b=%d\n", b); break; } } swapElement(&ary[a], &ary[b]); quicksort(ary, a+1, len-1); } } int main() { int n, i; scanf("%d", &n); ElementType list ; for(i=0; i<n; i++) { list[i] = i+1; } dictPrem(list, n); system("pause"); }
提交时间 | 状态 | 分数 | 题目 | 编译器 | 耗时 | 用户 |
---|---|---|---|---|---|---|
2018/1/3 11:05:10 | 答案正确 | 20 | 习题2.8 | C (gcc) | 549 ms | Roy |
测试点 | 提示 | 结果 | 耗时 | 内存 |
---|---|---|---|---|
0 | 1 | 答案正确 | 2 ms | 224KB |
1 | 2 | 答案正确 | 2 ms | 256KB |
2 | 3 | 答案正确 | 2 ms | 136KB |
3 | 4 | 答案正确 | 2 ms | 228KB |
4 | 5 | 答案正确 | 2 ms | 128KB |
5 | 6 | 答案正确 | 3 ms | 256KB |
6 | 7 | 答案正确 | 8 ms | 360KB |
7 | 8 | 答案正确 | 57 ms | 620KB |
8 | 9 | 答案正确 | 549 ms | 3876KB |
相关文章推荐
- 算法习题20:把字符串转换成整数并输出
- 7-14 输出全排列(20 分)
- PTA 输出全排列(20 分)
- 7-2 输出全排列(20 分)
- 7-2 输出全排列(20 分)(dfs)
- 输出全排列(20 分)
- 输出全排列(20 分)
- 习题2.8 输出全排列
- PTA 7-2 输出全排列(20 分)
- PAT1043. 输出PATest(20)
- 三个数排序。要求输入三个整数,按逗号隔开,把它们从小到大排列,输出结果用空格隔开。
- HDU1716 排列2【全排列+输出格式】
- 1043. 输出PATest(20)
- 输出N个数中取M个数的所有组合,排列情况
- 使用for语句输出2,4,6,....,20的三种方法
- 输出全排列
- 习题 2.4(6) 将100~200之间的素数输出。
- 将数组元素全排列后输出每个排列结果
- 输出一个字符串的全排列
- C++Primer第五版 第三章习题答案(11~20)