poj1256 dfs(全排列)

来源:互联网 发布:百度词条优化 编辑:程序博客网 时间:2024/05/16 17:10

题意:给定字符串(长度最大为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[n] = '\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;}}}


0 0
原创粉丝点击