一个简单的问题 -全排列
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中提供了一个全排列的函数,下面介绍一下,
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; }
相关文章推荐
- 《TCP/IP详解卷1:协议》——第1章:概述(转载)
- C语言中设置用户识别码的相关函数的简单讲解
- Cocoapod安装使用和常见问题
- rhel5.5镜像制作本地yum源(redhat5.5)
- final、finally和finalize的区别
- Proguard 部分类不混淆的技巧
- app宣传
- 【Android】 Service申请HashMap空间
- hive基本介绍以及性能优化
- eclipse debug on server 太卡的解决方法
- 准备篇—刘备,从编草鞋到编代码 第1回 哦,何为Android?
- 从GPU到3D渲染:游戏图形渲染技巧与性能优化
- NSDate和时间戳互转
- vc释放资源文件
- 选择结构
- smart svn
- poj3748 位运算 bitset
- grunt构建前端自动化的开发环境
- 常见文件系统的格式
- freemarker 解析字符串模板