题目:https://pintia.cn/problem-sets/434/problems/5811
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列
排在序列
之前,如果存在k使得
并且
。
输入样例:
3
输出样例:
123
132
213
231
312
321
代码:递归法(递归调用发生在for循环内)
#include <stdio.h>
#define MAXSIZE 9
int arr[MAXSIZE];
void Arrange(int arr[], int n, int curPos);
int main()
{
int n;
scanf("%d", &n);
Arrange(arr, n, 0);
return 0;
}
void Arrange(int arr[], int n, int curPos){
/* 递归函数:前继段已完成,设定arr[curPos],设定后续段
递归出口:curPos=n,当前排列完成,输出
*/
int i, curNum, j;
if(curPos==n){ /*输出一个排列*/
for(i=0; i<n; i++)
printf("%d", arr[i]);
printf("\n");
return;
}
else{ /*找到[1,n]中未填入arr的最小值填入arr[curPos]*/
for(curNum=1; curNum<=n; curNum++){
/* curNum=1时,可能curPos=0
curNum=2时,也可能curPos=0,
因为curPos+1层返回后当层curPos没变,而循环变量curNum自增了
*/
for(j=0; j<curPos; j++)
if(arr[j]==curNum)
break;
if(j==curPos){ /*curNum未安排*/
arr[curPos] = curNum;
Arrange(arr, n, curPos+1);
/*第三个参数改为++curPos竟然出错,
因为改变了当层递归的变量值*/
}
}
return;
}
}