POJ1256

去重复的排列。

直接DFS。

然而WA三次,后来看题解才发现、、、这是个奇葩的字典序、、所以还要重写cmp比较函数。

 1 /*************************
 2     POJ 1256
 3     728K
 4     360MS
 5     2015-06-27
 6     By JimmyLin
 7 *************************/
 8 #include<iostream>
 9 #include<cstdio>
10 #include<cstring>
11 #include<string>
12 #include<algorithm>
13  
14 using namespace std;
15 const int maxn=15;
16 int num[200];
17 char a[maxn],ans[maxn];
18 int tot;
19 
20 void init()
21 {
22     memset(num,0,sizeof(num));
23     memset(a,0,sizeof(a));
24     memset(ans,0,sizeof(ans));
25     tot=0;
26 }
27 void dfs(int x,int len)
28 {
29     if(x==len){
30         ans[len]='\0';
31         printf("%s\n",ans);
32         return;
33     }
34     for(int i=0;i<tot;i++)if(num[a[i]]){
35         ans[x]=a[i];
36         num[a[i]]--;
37         dfs(x+1,len);
38         num[a[i]]++;
39     }
40 }
41 char touppercase(char a)
42 {
43     if(a>='a')return a-('a'-'A');
44     return a;
45 }
46 bool cmp(const char &a,const char &b)
47 {
48     if('A'<=a&&'A'<=b&&'Z'>=a&&'Z'>=b||'a'<=a&&'a'<=b&&'z'>=a&&'z'>=b)return a<b; 
49     if(abs(a-b)==abs('A'-'a'))return a<='Z';
50     return touppercase(a)<touppercase(b);
51 }
52 int main()
53 {
54     int kase;
55     cin>>kase;
56     while(kase--){
57         init();
58         string s;
59         cin>>s;
60         for(int i=0;i<s.length();i++){
61             if(!num[s[i]])a[tot++]=s[i];
62             num[s[i]]++;
63         }
64         sort(a,a+tot,cmp);
65         dfs(0,s.length());
66     } 
67     return 0;
68 }

 

posted @ 2015-06-27 17:04  JimmyLin^_^  阅读(251)  评论(0编辑  收藏  举报