POJ 1256 Anagram(next_permutation全排列)

题目链接:http://poj.org/problem?id=1256

题目:

Anagram
Time Limit: 1000MS
Memory Limit: 10000K
Total Submissions: 17853
Accepted: 7268

Description

You are to write a program that has to generate all possible words from a given set of letters. 
Example: Given the word "abc", your program should - by exploring all different combination of the three letters - output the words "abc", "acb", "bac", "bca", "cab" and "cba". 
In the word taken from the input file, some letters may appear more than once. For a given word, your program should not produce the same word more than once, and the words should be output in alphabetically ascending order. 

Input

The input consists of several words. The first line contains a number giving the number of words to follow. Each following line contains one word. A word consists of uppercase or lowercase letters from A to Z. Uppercase and lowercase letters are to be considered different. The length of each word is less than 13.

Output

For each word in the input, the output should contain all different words that can be generated with the letters of the given word. The words generated from the same input word should be output in alphabetically ascending order. An upper case letter goes before the corresponding lower case letter.

Sample Input

3
aAb
abc
acba

Sample Output

Aab
Aba
aAb
abA
bAa
baA
abc
acb
bac
bca
cab
cba
aabc
aacb
abac
abca
acab
acba
baac
baca
bcaa
caab
caba
cbaa

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'.

Source

题目分析:这一题主要要用到next_permutation这个函数,它可以方便地生成全排列。next_permutation的函数声明如下:

#include<algorithm>

bool next_permutation( iterator start, iterator end );

还有用到sort函数,头文件为#include<string.h>

扩展:prev_permutation默认得到的是上一次排列的顺序。

这里总结一下对next_permutation的用法:

(1)

对int类型数组排列(char,double型与int相同)

int num[100];

int cmp(int a ,int b)

{

      return a < b;   //若将 “>” 改为“<”则相当于prev_permutation

}

next_permutation(num,num+100,cmp);

(2)

对string类型排列

string str;

int cmp(char a ,char b)

{  

      return a<b;

}

next_permutation(str.begin(),str.end(),cmp);

(3)

对结构体的排列

struct node

{

      int x,y;

}s[100];

int cmp(node a ,node b)

{

      return a.x<b.x;

}

next_permutation(s,s+100,cmp);

我们回到题目中,这题还要注意题目后面的要求:An upper case letter goes before the corresponding lower case letter. 
So the right order of letters is 'A'<'a'<'B'<'b'<...<'Z'<'z'.所以要自己另外写一个cmp函数。

参考代码如下,已AC:

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<ctype.h>
#define N 14
using namespace std;

char str[N];
bool cmp(char a,char b){
	if(toupper(a)==toupper(b))
		return a<b;
	else{
		return toupper(a)<toupper(b);
	}
}
int main(){
	int n,len;
	scanf("%d",&n);
	while(n--){
		scanf("%s",str);
		len = strlen(str);
		sort(str,str+len,cmp);
		printf("%s\n",str);
		while(next_permutation(str,str+len,cmp)){
			printf("%s\n",str);
		}
	}
	return 0;
}
请广大读者多多指教~谢谢 吐舌头


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值