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;

}
时间: 2024-11-06 07:19:27

POJ 1256 Anagram(输入可重集枚举排序)的相关文章

poj 1256 Anagram

题目链接:http://poj.org/problem?id=1256 思路:     该题为含有重复元素的全排列问题:由于题目中字符长度较小,采用暴力法解决. 代码如下: #include <iostream> #include <algorithm> using namespace std; const int MAX_N = 20; char P[MAX_N], A[MAX_N]; char * SortAlp( char P[], int n ) { int Low[MAX

7 POJ 1256 Anagram

给一个字符串包含大小写字符,规定'A'<'a'<'B'<'b'<...<'Z'<'z',求该字符串的全排列. 用裸的dfs+map判重 写了一遍超时了,那种机智的dfs方法没有怎么看懂.. 最开始用的set+next_permutation,太年轻,也超时了... 运用一个next_permutation()函数即可,<algorithm>头文件 注意要先将字符串sort一遍,然后next_permutation()也要把比较函数cmp传进去,原来都不知道可

POJ 3660Cow Contest(并查集+拓扑排序)

Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7567   Accepted: 4206 Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others

生成可重集的排序 (白书P184)

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int ans[6]; int book[6],a[6],n; void dfs(int cnt) { int i,j; if(cnt==n) { for(i=0;i<n;i++) if(!i) printf("%d",ans[i]); else

暴力搜索专题小结:全排列及可重集排列生成算法

1~n的全排列 (1)思路:按照递归的思想,初始化集合S中含有1~n所有元素.如果1~n的集合S为空,那么输出全排列:否则从小到大依次考虑每个元素i,在A的末尾添加i后,集合S变为S-{i}.这里我们不需要集合S,只需要利用一个变量cur表示当前位要填的数即可.那么A中没有出现过的元素均可以选择. #define N 100 int A[N]; void print_permutation(int n, int*A, int cur) { if (cur == n) { for (int i =

hdu 1598 find the most comfortable road(并查集+枚举)

find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4899    Accepted Submission(s): 2131 Problem Description XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超

hdu1598find the most comfortable road(并查集+枚举,求起点到终点的边中最大边减最小边差值最小)

Problem Description XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的"舒适度"有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ), 但XX星人对时间却没那么多要求.要你找出一条城市间的最舒适的路径.(

[ACM] POJ 1611 The Suspects (并查集,输出第i个人所在集合的总人数)

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 21586   Accepted: 10456 Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. T

极品飞车(并查集+枚举)

极品飞车(并查集+枚举) Hecy被FC星人劫持了! “长的帅也是一种罪过吗?”,Hecy问劫持他的生物,结果被暴打.唉,原来Hecy被劫持的原因是FC星人看中了他的编程才能(“我真的长的不帅吗?”Hecy不死心地问另一个生物,结果再次被暴打). FC星有许多城市,某些城市之间无法直接到达,但某些城市之间可以通过一种奇怪的高速公路SARS(Super Air Roam Structure 超级空中漫游结构)进行人员或物资的交流运输.在SARS上有且仅有一种“车”可以行驶,那就是传说中的极品飞车F