• 【ZeroJudge】d781 Anagram


    内容 :

    給你一些字元(字串),請你從這些字元產生所有可能的組合。

    例如:給你"abc",你的程式應該要產生"abc", "acb", "bac", "bca", "cab" , "cba"

    輸入的字元可能會有重複的,但輸出請不要有重複的字串出現。字串輸出的次序請依字元次序遞增。字元次序:AaBbCcDd.....YyZz。

    输入说明 :

    第1列有一個整數 n,代表接下來有n列測試資料。每列測試資料由大寫或小寫的英文字元組成。大小寫請視為不同的字元。

    输出说明 :

    每一筆測試資料請輸出所有可能的組合,每種組合一列。輸出的次序請依字元次序遞增。請參考Sample Output。

    范例输入 :help

     
    3
    abc
    acba
    BaA

    范例输出 :

    abc
    acb
    bac
    bca
    cab
    cba
    aabc
    aacb
    abac
    abca
    acab
    acba
    baac
    baca
    bcaa
    caab
    caba
    cbaa
    AaB
    ABa
    aAB
    aBA
    BAa
    BaA

    提示 :

    Lucky 貓

    出处 :

    UVa ACM 195 
    (管理:snail)

    Code:

     1 // 以下程式碼由 sagit 所撰寫,學術使用可自由轉載,但請註明本站網址。
     2 // Sagit's ACM Code:  http://www3.tcgs.tc.edu.tw/~sagit/acm/
     3 
     4 #include <iostream>
     5 #include <cstring>
     6 #define N 81
     7 
     8 using namespace std;
     9 
    10 char ch[N], ans[N];
    11 int num[N], kind, total;
    12 
    13 int Order(char c)
    14 {
    15     return ( (c>='A') && (c<='Z') ) ? (c-'A')*2 : (c-'a')*2+1;
    16 }
    17 
    18 void Init(char s[])
    19 {
    20     int i, j, k, t1;
    21     char t2;
    22     kind=0;
    23     total=strlen(s);
    24     ans[total]=0;
    25     for (i=0; i<total; i++)
    26     {
    27         for (j=0; j<kind; j++)
    28             if(s[i]==ch[j]) break;
    29         if(j<kind) num[j]++;
    30         else
    31         {
    32             ch[kind]=s[i];
    33             num[kind]=1;
    34             kind++;
    35         }
    36     }
    37     for (i=0; i<kind-1; i++)
    38     {
    39         for (j=i+1, k=i; j<kind; j++)
    40             if(Order(ch[j])<Order(ch[k])) k=j;
    41         t1=num[i], t2=ch[i];
    42         num[i]=num[k], ch[i]=ch[k];
    43         num[k]=t1, ch[k]=t2;
    44     }
    45 }
    46 
    47 void Perm(int n)
    48 {
    49     int i, j;
    50     if(n>=total)
    51     {
    52         cout << ans << endl;
    53         return;
    54     }
    55     for (i=0; i<kind; i++)
    56     {
    57         if(num[i]<=0) continue;
    58         ans[n]=ch[i];
    59         num[i]--;
    60         Perm(n+1);
    61         num[i]++;
    62     }
    63 }
    64 
    65 int main()
    66 {
    67     int n, i;
    68     char s[N];
    69     cin >> n;
    70     for (i=0; i<n; i++)
    71     {
    72         cin >> s;
    73         Init(s);
    74         Perm(0);
    75     }
    76     //system("PAUSE");
    77     return 0;
    78 }
    观看代码

    引用转载自sagit撰写的代码,sagit拥有所有的解释权。

    sagit要求注明的网址:

    Sagit's ACM Code:  http://www3.tcgs.tc.edu.tw/~sagit/acm/

  • 相关阅读:
    【lc-database】595. 大的国家
    Visual Studio 2010软件安装教程
    Win10系统下安装VC6.0教程
    HTTP协议
    正则表达式
    类装饰器
    装饰器工厂函数
    装饰器函数
    闭包
    web服务器
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/zoj_d781.html
Copyright © 2020-2023  润新知