码迷,mamicode.com
首页 > 其他好文 > 详细

POJ1256

时间:2015-06-27 18:14:12      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:

去重复的排列。

直接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 }

 

POJ1256

标签:

原文地址:http://www.cnblogs.com/happyJimmyLin/p/4604293.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!