您的位置:首页 > 其它

POJ1256 Anagram STL中的next_permutation()

2011-07-31 11:55 405 查看
Problem Address:http://poj.org/problem?id=1256

发现了stl中的next_permutation()是用来计算某个字符串的下一个全排列的。

还有一个prev_permutation(),其作用相反。

对于给定的字符串,按照新的排序规则,输出其全排列。

【非stl版】

172K79MSC++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;
}


【next_permutation()版】

168K63MSC++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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: