算法设计——全排列(递归)

刚开始不太理解交换的意义
后来发现就是一个不断交换的过程,但要恢复状态

问题

输入一个数字
并对其全排列序列进行输出

思路

我们对于全排列,如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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值