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;
}
}
}
算法:
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;
}
}
}
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006