poj 1256 Anagram

/*
題意:有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
*/
發佈了64 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章