Problem Address:http://poj.org/problem?id=1256
发现了stl中的next_permutation()是用来计算某个字符串的下一个全排列的。
还有一个prev_permutation(),其作用相反。
对于给定的字符串,按照新的排序规则,输出其全排列。
【非stl版】
172K | 79MS | C++ | 822B |
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int rank[300];
bool cmp (char a, char b)
{
return rank[a]<rank[b];
}
char str[20];
int visited[20];
int len;
void dfs(char *t, int k)
{
if (k==len)
{
printf("%s\n", t);
return;
}
int i;
for (i=0; i<len; i++)
{
if (visited[i]==0)
{
visited[i] = 1;
t[k] = str[i];
dfs(t, k+1);
visited[i] = 0;
while(i+1<len && str[i+1]==str[i]) i++;
}
}
}
int main()
{
int t;
int i;
char temp[20];
for (i=0; i<=26; i++)
{
rank[i+'A'] = i*2;
rank[i+'a'] = i*2+1;
}
scanf("%d", &t);
while(t--)
{
scanf("%s", str);
len = strlen(str);
sort(str, str+len, cmp);
memset(visited, 0, sizeof(visited));
temp[len] = '\0';
dfs(temp, 0);
}
return 0;
}
168K | 63MS | C++ | 511B |
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int rank[300];
bool cmp(char a, char b)
{
return rank[a]<rank[b];
}
int main()
{
int t;
int i;
char str[20];
int len;
for (i=0; i<=26; i++)
{
rank[i+'A'] = i*2;
rank[i+'a'] = i*2+1;
}
scanf("%d", &t);
while(t--)
{
scanf("%s", str);
len = strlen(str);
sort(str, str+len, cmp);
do
{
printf("%s\n", str);
}while(next_permutation(str, str+len, cmp));
}
return 0;
}