现在的位置: 首页 > 综合 > 正文

poj 1256 Anagram

2015年02月08日 ⁄ 综合 ⁄ 共 1017字 ⁄ 字号 评论关闭

/*
题意:有t组数据,每组有不超过13个字符的字符串,有大小写的区分顺序是'A'<'a'<'B'<'b'<...<'Z'<'z'.输出所有的全排列
按从小到大的顺序输出。
排序后像输出素数环一样输出,问题是怎样进行判重,加一个标记,但这个标记不递归下去,因为排序后相同的字符肯定在一块
当和标记不一样时,因为有for循环存在,所以不会再出现,所以就去掉重复的,因为是递归,所以每一层都有一个flag1,但每
一层的flag1的值是不一样的
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
    char s;
    int Rank;
}a[15];
bool cmp(node p,node q)
{
    return p.Rank<q.Rank;
}
int len,flag[15];
char str1[15];
void dd(int k)
{
    char flag1=1;
    int i;
    if(k==len)
    {
        str1[len]='\0';
        puts(str1);
    }
    else
    {
        for(i=0;i<len;i++)
        {
            if(flag[i]==0)
            {
                if(a[i].s==flag1)
                    continue;
                flag1=a[i].s;
                flag[i]=1;
                str1[k]=a[i].s;
                dd(k+1);
                flag[i]=0;
            }
        }
    }
}
int main()
{
    char str[15];
    int t,i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",str);
        len=strlen(str);
        for(i=0;i<len;i++)
        {
            a[i].s=str[i];
            if(str[i]>='a')
                a[i].Rank=(str[i]-'a')*2+1;
            else
                a[i].Rank=(str[i]-'A')*2;
        }
        sort(a,a+len,cmp);
        dd(0);
    }
    return 0;
}
/*
10
AAAAaZ
*/

【上篇】
【下篇】

抱歉!评论已关闭.