首页 > 代码库 > POJ 1256 Anagram(输入可重集枚举排序)
POJ 1256 Anagram(输入可重集枚举排序)
【题意简述】:本题题意很好理解!题目给出的Hint,使我们对关键点有了更加清晰的认识
An upper case letter goes before the corresponding lower case letter.
So the right order of letters is ‘A‘<‘a‘<‘B‘<‘b‘<...<‘Z‘<‘z‘.
就是给一个序列(序列可以有重复的元素),让我们输出它的所有排列,字母顺序规定给出!
【分析】:这道题是我之前学习枚举排序和子集生成时找到的练习题,关于枚举排序和子集生成的相关算法在这 关于算法竞赛入门经典一书的思考学习——枚举排序和子集生成!
/* Date:2014/11/02 By: VID Attention: 这个问题唯一难点就是枚举排列,当然方法不是唯一的,可以使用STL,也可以像我这样 自己写枚举的函数。 还有就是在输入的同时自己写一个按照题目规则的字母的优先顺序,然后调用枚举排序函数, 得到结果就可以了! */ // 232K 329Ms #include<iostream> #include<cstring> using namespace std; #define N 14 char P[N],A[N]; void order(char* p) { int i,j; int len = strlen(p); char tmp; for(i = 0;i<len-1;i++) { for(j = i+1;j<len;j++) { if(((p[i]>p[j])&&(p[j]>='a'))||((p[i]<'a')&&(p[i]>p[j])&&(p[j]>='A'))||((p[i]>='a')&&(p[j]<'a')&&((p[i]-'a')>=(p[j]-'A'))) ||((p[i]<'a')&&(p[j]>='a')&&((p[i]-'A')>(p[j]-'a')))) { tmp = p[i]; p[i] = p[j]; p[j] = tmp; } } } // for(i =0;i<len;i++) // cout<<p[i]<<endl; } // 递归… void print_pumutation(int n,char P[],char A[],int cur) { int i,j; if(cur == n) // cur指的是当前的位置! { for(i = 0;i<n;i++) cout<<A[i]; cout<<endl; } else for(i = 0;i<n;i++) if(!i||P[i]!=P[i-1]) // 这里是为了检查P的第一个元素和所有与第一个元素不相同的元素, // 只有这个时候,我们才对它进行递归调用! { int c1 = 0,c2 = 0; for(j = 0;j<cur;j++) if(A[j] == P[i]) c1++; // 在A[0]~A[cur-1]中P[i]出现的次数。 for(j = 0;j<n;j++) if(P[i] == P[j]) c2++; // 在数组P中P[i]出现的次数。 if(c1<c2) { A[cur] = P[i]; print_pumutation(n,P,A,cur+1); } } } int main() { int test; int len; cin>>test; while(test--) { cin>>P; len = strlen(P); order(P); print_pumutation(len,P,A,0); } return 0; }
POJ 1256 Anagram(输入可重集枚举排序)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。