单词的全排列同时去重复的元素
2014-03-15 15:22
260 查看
主要用到回溯算法,用排列树框架
#include<iostream>
#include<stdlib.h>
using namespace std;
char test[200][20];
//int n;
int count1;
inline void swap(char *s,char *t){
char temp;
temp=*s;
*s=*t;
*t=temp;
}
void dfs(int t,char *c,int n){
if(t==(n)){
//输出单词
c[t]='\0';
int i=0;
for(;i<count1;i++){
if(strcmp(c,test[i])==0)
break;
}
if(i==count1){
strcpy(test[count1++],c);
cout<<c<<endl;
}
//c[0]='\0';
return ;
}
else
{
//产生前缀
for(int i=t;i<n;i++){
swap(&c[t],&c[i]);
dfs(t+1,c,n);
//回溯
swap(&c[t],&c[i]);
}
}
}
int main(){
char word[20];
cin>>word;
int n;
//memset(test)
char temp[20];
n=strlen(word);
cout<<endl<<endl;
//cout<<n;
strcpy(temp,word);
dfs(0,temp,n);
cout<<count1;
return 0;
}
#include<iostream>
#include<stdlib.h>
using namespace std;
char test[200][20];
//int n;
int count1;
inline void swap(char *s,char *t){
char temp;
temp=*s;
*s=*t;
*t=temp;
}
void dfs(int t,char *c,int n){
if(t==(n)){
//输出单词
c[t]='\0';
int i=0;
for(;i<count1;i++){
if(strcmp(c,test[i])==0)
break;
}
if(i==count1){
strcpy(test[count1++],c);
cout<<c<<endl;
}
//c[0]='\0';
return ;
}
else
{
//产生前缀
for(int i=t;i<n;i++){
swap(&c[t],&c[i]);
dfs(t+1,c,n);
//回溯
swap(&c[t],&c[i]);
}
}
}
int main(){
char word[20];
cin>>word;
int n;
//memset(test)
char temp[20];
n=strlen(word);
cout<<endl<<endl;
//cout<<n;
strcpy(temp,word);
dfs(0,temp,n);
cout<<count1;
return 0;
}
相关文章推荐
- 有重复元素的全排列
- 包含重复元素的全排列
- SSL JudgeOnline 1357——有重复元素的全排列
- 检测列表是否含有重复元素 保持元素顺序的同时去除重复元素
- 全排列—存在重复元素
- 集合的全排列(可包含重复元素)
- DFS-带重复元素的全排列
- 求输入字符串的全排列 (无重复元素)
- 有重复元素的全排列
- 计数与概率基础(容斥、有重复元素的全部排列、可重复选择的全排列、杨辉、二项式定理、欧拉函数)
- 全排列的java实现(无重复元素)
- 如何得到有重复元素的不重复全排列
- 含重复元素序列的全排列
- 带重复元素以及不带重复元素的全排列
- Python: 序列list:保持元素顺序同时消除重复值
- 递归实现全排列(可包含重复元素)
- leetcode-47. Permutations II(重复元素全排列)
- leetcode-46. Permutations(非重复元素全排列)
- 【ZOJ】3841 Card (搜索+组合数学(重复元素的全排列)
- 输出一组元素的全排列(可包含重复元素)