POJ 1256.Anagram

2015-06-04

问题简述:

  输出一串字符的全排列,顺序不同于一般的字母序,而是 A<a<B<b......<Z<z。所以应该重写一个比较函数。

  原题链接:http://poj.org/problem?id=1256

解题思路:

  两种方法:

  方法一:简单的深搜 DFS 搜索所有的可能,但是要注意几个连续相同的字符算作一种情况。

  方法二:使用 STL 的 next_permutation 函数可以很方便的生成全排列。

      关于 next_permutation 函数,可以参考:姜南(Slyar)的文章(点击直接跳转) 感谢原作者!

 

DFS源代码:

 1  /*
 2 OJ: POJ
 3 ID: 3013216109
 4 TASK: 1256.Anagram
 5 LANG: C++
 6 NOTE: DFS
 7 */
 8 #include <cstdio>
 9 #include <string>
10 #include <cstring>
11 #include <algorithm>
12 using namespace std;
13 
14 int n;
15 char str[13],ans[13];
16 int visited[13];
17 
18 bool cmp(char a,char b) {
19     if(tolower(a)==tolower(b))
20         return a<b;
21     else
22         return tolower(a)<tolower(b);
23 }
24 
25 void dfs(int t) {
26     if(t==strlen(str)) {
27         for(int i=0;i<t;i++)
28             printf("%c",ans[i]);
29         printf("\n");
30         return;
31     }
32     for(int i=0;i<strlen(str);i++) {
33         if(!visited[i]) {
34             ans[t]=str[i];
35             visited[i]=1;
36             dfs(t+1);
37             visited[i]=0;
38             while(i+1<strlen(str)&&str[i]==str[i+1]) i++;
39         }
40     }
41 }
42 
43 int main()
44 {
45     scanf("%d",&n);
46     getchar();
47     while(n--) {
48         memset(visited,0,sizeof(visited));
49         gets(str);
50         sort(str,str+strlen(str),cmp);
51         dfs(0);
52     }
53     return 0;
54 }

 

STL源代码:

 

 1  /*
 2 OJ: POJ
 3 ID: 3013216109
 4 TASK: 1256.Anagram
 5 LANG: C++
 6 NOTE: NEXT_PERMUTATION
 7 */
 8 #include <cstdio>
 9 #include <string>
10 #include <cstring>
11 #include <algorithm>
12 using namespace std;
13 
14 int n;
15 char str[13];
16 
17 bool cmp(char a,char b) {
18     if(tolower(a)==tolower(b))
19         return a<b;
20     else
21         return tolower(a)<tolower(b);
22 }
23 
24 
25 int main()
26 {
27     scanf("%d",&n);
28     getchar();
29     while(n--) {
30         gets(str);
31         sort(str,str+strlen(str),cmp);
32         do {
33             puts(str);
34         } while(next_permutation(str,str+strlen(str),cmp));
35     }
36     return 0;
37 }

 

posted @ 2015-06-04 10:44  ACMan  阅读(209)  评论(0编辑  收藏  举报