您的位置:首页 > 其它

POJ 1256 Anagram(输入可重集枚举排序)

2014-11-05 13:11 501 查看
【题意简述】:本题题意很好理解!题目给出的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
,A
;

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: