标题7-12【拓展编程_课后练习】【陈越教材 习题2.8】 输出全排列 (20分)
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a
1
,a
2
,⋯,a
n
排在序列b
1
,b
2
,⋯,b
n
之前,如果存在k使得a
1
=b
1
,⋯,a
k
=b
k
并且 a
k+1
<b
k+1
。
输入样例:
3
输出样例:
123
132
213
231
312
321
这道题用到了回溯法·,自己跟着撸一遍就差不多能理解
#include<stdio.h>
#define max 20
int a[max];
void f(int n, int a[], int cur);
int main()
{
int n;
scanf("%d", &n);
f(n, a, 0);
return 0;
}
void f(int n, int a[], int cur)
{
int i, j;
if (cur == n) {
for ( i = 0; i < n; i++) {
printf("%d", a[i]);
}
printf("\n");
}
else {
for (i = 1; i <= n; i++) {//作用是给a[cur]赋值,
int flag = 1;
for (j = 0; j < cur; j++) {//查找前面是否出现i;
if (a[j] == i)flag = 0;
}
if (flag) {
a[cur] = i;
f(n, a, cur + 1);//下一个位置
}
}
}
}
qqqqq