刚开始不太理解交换的意义
后来发现就是一个不断交换的过程,但要恢复状态
问题
输入一个数字
并对其全排列序列进行输出
思路
我们对于全排列,如4
1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321
我们可看做是不同数字1、2、3…插入到除此数字外的全排列中
即先拿出1(定位在首位),进行全排列,记得回复状态
拿出2(定位首位),全排列
整体思想即是对数字不断进行交换,记得要恢复状态
代码实现
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int n,a[100];
void fun(int x){
int i;
if(x==n){//当元素均遍历完
for(i=1;i<=n;i++){//输出
printf("%d ",a[i]);
}
printf("\n");
return ;
}
for(i=x;i<=n;i++){
int temp=a[i];//定位到第x个数字
a[i]=a[x];//遍历与后面数字进行交换
a[x]=temp;
fun(x+1);//对后续数字进行全排列
temp=a[i];//恢复初始状态
a[i]=a[x];
a[x]=temp;
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int i;
scanf("%d",&n);
memset(a,0,sizeof(a));
for(i=1;i<=n;i++){
a[i]=i;//定位每个元素初始位置
}
fun(1);
}
return 0;
}