您的位置:首页 > 其它

poj1256 dfs(全排列)

2016-03-06 18:19 309 查看
题意:给定字符串(长度最大为13),字母可能有重复,要求按升序输入其所有的全排列,注意,字母的大小顺序为A<a<B<b<...<Z<z

算法:

1.dfs 

2.STL

/*
算法:dfs
*/
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

char c[20]; // 存储输入的字符串
char ans[20]; // 存放结果
int cnt[100]; // 存放每个字母出现的次数

bool cmp(const char &a, const char &b)
{
if (a >= 'A' && a <= 'Z' && b >= 'A' && b <= 'Z')
{
return a < b;
}
else if (a >= 'a' && a <= 'z' && b >= 'a' && b <= 'z')
{
return a < b;
}
else if (a >= 'A' && a <= 'Z' && b >= 'a' && b <= 'z')
{
return a + 32 <= b ;
}
else if (a >= 'a' && a <= 'z' && b >= 'A' && b <= 'Z')
{
return a < b+32;
}
}

void dfs(int curr, int n)
{
if (curr == n)
{
ans
= '\0';
cout << ans << endl;
return;
}
for (int i=0; i<n; i++)
{
// 如果c[i]==c[i-1],为了避免重复枚举,即相同的值只枚举一次,故c[i]不再枚举
if (i == 0 || c[i] != c[i-1])
{
if (cnt[c[i]-'A'] > 0)
{
cnt[c[i]-'A']--;
ans[curr] = c[i];
dfs(curr+1,n);
cnt[c[i]-'A']++;
}
}
}
}

int main()
{
int cases;
cin >> cases;
for (int i=0; i<cases; i++)
{
cin >> c;
int len = strlen(c);
sort(c,c+len,cmp);
memset(cnt,0,sizeof(cnt));
for (int i=0; i<len; i++)
{
cnt[c[i]-'A']++;
}
dfs(0,len);
}
}


/*
算法:STL
*/

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

bool cmp(const char &a, const char &b)
{
if (a >= 'A' && a <= 'Z' && b >= 'A' && b <= 'Z')
{
return a < b;
}
else if (a >= 'a' && a <= 'z' && b >= 'a' && b <= 'z')
{
return a < b;
}
else if (a >= 'A' && a <= 'Z' && b >= 'a' && b <= 'z')
{
return a + 32 <= b ;
}
else if (a >= 'a' && a <= 'z' && b >= 'A' && b <= 'Z')
{
return a < b+32;
}
}

int main()
{
int cases;
char c[20];
cin >> cases;
for (int i=0; i<cases; i++)
{
cin >> c;
int len = strlen(c);
sort(c,c+len,cmp);
cout << c << endl;
while(next_permutation(c, c+len, cmp))
{
cout << c << endl;
}
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj dfs