中阶算法---递归(4)

全排列

  • 输入一个整数n(n <= 9),输出1、2、3、······、n这n个数的全排列(按照字典序输出)。
    输入
    一个整数n
    输出
    多行,每行表示一种排列,行内使用空格分隔相邻两数。
    输入样例
    3
    输出样例
    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 1 2
    3 2 1
//include<bits/stdc++.h>
#include <iostream>
#include<cstdio>
#include<algorithm> 
using namespace std;
int arr[10];
int main(){
	int n,i;
	cin>>n;
	for(i=1;i<=n;i++){
		arr[i]=i;
	}
	do{
		for(int i=1;i<=n;i++) 
		    printf("%d ",arr[i]);
		printf("\n");
	}while(next_permutation(arr+1,arr+n+1));
	return 0;
}
  • 给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。
    输入
    输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)
    输出
    输出S所包含的字符组成的所有排列
    输入样例
    1312
    输出样例
    1123
    1132
    1213
    1231
    1312
    1321
    2113
    2131
    2311
    3112
    3121
    3211
//include<bits/stdc++.h>
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int arr[20];
char str[15];
int main(){
	gets(str);
	n=strlen(str);
	for(int i=0;i<n;i++){
		arr[i]=str[i]-'0';
	}
	sort(arr,arr+n);
	do{
		for(int i=0;i<n;i++)
		   printf("%d",arr[i]);
		printf("\n");
	}while(next_permutation(arr,arr+n));
	return 0;
}

全排列函数还是牛逼的,针对数字排列的问题基本上都是秒解~但是要注意啊,这里最好不要用cout!会出现时间超限的问题!
除了直接用全排列函数,还有没有其他的方式来解决全排列类的问题?
…还可以使用递归,额。。。也可以称作深搜+回溯!

//include<bits/stdc++.h>
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[15];
bool vis[15];
void dfs(int x){
	if(x==n+1){
		for(int i=1;i<=n;i++){
			printf("%d ",a[i]);
		}
		printf("\n");
		return ;
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			a[x]=i;
			vis[i]=1;
			dfs(x+1);
			vis[i]=0;
		}
	}
}
int main(){
	cin>>n;
	dfs(1);
	return 0;
}
//include<bits/stdc++.h>
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,b[20];
char a[15];
bool vis[15];
void dfs(int num[],int step){
	if(step==n){
		for(int i=0;i<n;i++){
			printf("%d",b[i]);
		}
		printf("\n");
		return;
	}
	for(int i=0;i<n;i++){
		if(!vis[i]){
			vis[i]=1;
			b[step]=num[i];
			dfs(num,step+1);
			vis[i]=0;
			while(i<n-1&&num[i]==num[i+1]){//重复的数字就不需要再进行全排列了。
				i++;
			}
		}
	}
}
int main(){
	int num[20];
	gets(a);
	n=strlen(a);
	for(int i=0;i<n;i++){
		num[i]=a[i]-'0';
	}
	sort(num,num+n);
	dfs(num,0);
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值