您的位置:首页 > 其它

一个简单的问题 -全排列

2015-08-28 16:59 267 查看
全排列一共分为两种情况,有重复元素和无重复元素,大一开始做的时候不会写,现在特意写一下这个问题的各种解法。

1.无重复元素,这种相对简单一些,用递归就可以了

  首先找到第一个字母,然后找到剩余的字母中的第一个字母,依次类推,很简单,代码如下:

//本来准备用dfs写,发现两个的复杂度是一样的,就没有必要了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

char str[10],ans[10];
int n;

void dfs(int cur)
{
if(cur==n)
{
for(int i=0;i<n;i++)
putchar(ans[i]);
putchar('\n');
}
else
{
for(int i=0;i<n;i++)
{
bool ok=1;
for(int j=0;j<cur;j++)
if(ans[j]==str[i])
{
ok=0;
break;
}
if(ok)
{
ans[cur]=str[i];
dfs(cur+1);
}
}
}
}

int main()
{
while(~scanf("%s",str))
{
n=strlen(str);
sort(str,str+n);
dfs(0);
}
return 0;
}

2.现在介绍第二种,就是有重复元素的情况,例如abbc的排列

先介绍一种简单的方法,stl中提供了一个全排列的函数,下面介绍一下,

next_permutation是头文件algorithm中的一个函数,使用的时候必须引用这个头文件,下面是他的使用方法

next_permutation(str+s,str+e);str是一个字符数组,str+n,表示数组需要排列开始的地方,str+e表示数组排列结束的地方,他的含义是这个序列内的字符按照字典序的大小产生下一个序列,代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int main()
{
char s[10],str[10];
cin>>s;
strcpy(str,s);
int len=strlen(s);
do{
cout<<s<<endl;
next_permutation(s,s+len);
}while(strcmp(str,s));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: