题目链接:http://poj.org/problem?id=1256
题目:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 17853 | Accepted: 7268 |
Description
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
Output
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
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;
}
请广大读者多多指教~谢谢