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 }

 

你可能感兴趣的:(poj)