to fyje(冬原)  哎,有点意思 ^^

解决方案 »

  1.   

    用回溯算法可以解决,如还不明白请与我联系[email protected]
      

  2.   

    to  topmint(秋景)   我的问题说的很明白了,在这里给我讲讲你的算法吧,我这里时间比较紧
      to  大家  谢谢大家的关注,请有好想法的详细一点 OK
      

  3.   

    l - 字个数
    word[] - 每一字
    for(int i=0; i<l; i++)
    {
       CString s("");
       CString temp("");
       temp = GetFirstSound(word[i]);
       for(;Temp != NULL;)
       {
          s += Temp
          Temp = GetNextMultiSound(word[i]);
       }
       s += "'";
    }
      

  4.   

    #include <vcl.h> 
    #include "hztopy.h" AnsiString ConvertHZToPY(char *as_HzString) 

        static int li_SecPosValue[]={1601,1637,1833,2078,2274,2302,2433,2594,2787,3106,3212,3472,3635,3722,3730,3858,4027,4086,4390,4558,4684,4925,5249}; 
        static char* lc_FirstLetter[]  = {"A", "B","C","D","E","F","G","H","J","K","L","M","N","O","P","Q","R","S","T","W","X","Y","Z"}; 
        static char* ls_SecondSecTable = 
    "CJWGNSPGCGNE[Y[BTYYZDXYKYGT[JNNJQMBSGZSCYJSYY[PGKBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHFFSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHY" 
    "LYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJWXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWY" 
    "WSBHTRXXGLHQHFNM[YKLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMY" 
    "DJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZP" 
    "MGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJECXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJX[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJB" 
    "PMLMSXLZJQQHZYJCZYDJWBMYKLDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLCLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTX" 
    "YXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPDXCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGS" 
    "QQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSLYGKDZPZXJ" 
    "YYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZK" 
    "HHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQ" 
    "FHBSAQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ"; 
        AnsiString result = ""; 
        int H,L,W; 
        unsigned int i, stringlen = strlen(as_HzString); 
        int j;     for( i = 0; i < stringlen; i ++ ) 

    H = (unsigned char)(as_HzString[i + 0]); 
    L = (unsigned char)(as_HzString[i + 1]); 
    if(H < 0xA1 || L < 0xA1) 

    result += as_HzString[i]; 
    continue; 

    else W = (H - 160) * 100 + L - 160; if(W > 1600 && W < 5590) 

    for(j = 22; j >= 0; j --) 
    if(W >= li_SecPosValue[j]) 

    result += lc_FirstLetter[j]; 
    i ++; 
    break; 

    continue; 

    else 

    i ++; 
    W = ( H - 160 - 56 )*94 + L - 161; 
    if(W >= 0 && W <= 3007) 
    result += ls_SecondSecTable[W]; 
    else 

    result += (char)H; 
    result += (char)L; 


    } return result; 

      

  5.   

    应该不难,按照AscII码比较排序就可以了。懒得写了。先讲字符串按照长度排序,再按照第一个字符的AscII排序,再按照第二个字符的ASCII排序如此类推,把排序写成一个函数,输入是两个字符,输出一个Boolean,剩下的就和数字排序是一样的了。不过多做几便就可以了。
      

  6.   

    /*如果是VC,可将AnsiString用String代替即可*/ #include <vcl.h> 
    #include "hztopy.h" AnsiString ConvertHZToPY(char *as_HzString) 

        static int li_SecPosValue[]={1601,1637,1833,2078,2274,2302,2433,2594,2787,3106,3212,3472,3635,3722,3730,3858,4027,4086,4390,4558,4684,4925,5249}; 
        static char* lc_FirstLetter[]  = {"A", "B","C","D","E","F","G","H","J","K","L","M","N","O","P","Q","R","S","T","W","X","Y","Z"}; 
        static char* ls_SecondSecTable = 
    "CJWGNSPGCGNE[Y[BTYYZDXYKYGT[JNNJQMBSGZSCYJSYY[PGKBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHFFSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHY" 
    "LYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJWXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWY" 
    "WSBHTRXXGLHQHFNM[YKLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMY" 
    "DJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZP" 
    "MGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJECXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJX[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJB" 
    "PMLMSXLZJQQHZYJCZYDJWBMYKLDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLCLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTX" 
    "YXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPDXCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGS" 
    "QQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSLYGKDZPZXJ" 
    "YYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZK" 
    "HHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQ" 
    "FHBSAQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ"; 
        AnsiString result = ""; 
        int H,L,W; 
        unsigned int i, stringlen = strlen(as_HzString); 
        int j;     for( i = 0; i < stringlen; i ++ ) 

    H = (unsigned char)(as_HzString[i + 0]); 
    L = (unsigned char)(as_HzString[i + 1]); 
    if(H < 0xA1 || L < 0xA1) 

    result += as_HzString[i]; 
    continue; 

    else W = (H - 160) * 100 + L - 160; if(W > 1600 && W < 5590) 

    for(j = 22; j >= 0; j --) 
    if(W >= li_SecPosValue[j]) 

    result += lc_FirstLetter[j]; 
    i ++; 
    break; 

    continue; 

    else 

    i ++; 
    W = ( H - 160 - 56 )*94 + L - 161; 
    if(W >= 0 && W <= 3007) 
    result += ls_SecondSecTable[W]; 
    else 

    result += (char)H; 
    result += (char)L; 


    } return result; 
    }
      

  7.   

    上面有点问题
    应这样: l - 字个数
    word[] - 每一字CString s("");
    for(int i=0; i<l; i++)
    {   
       CString temp("");
       temp = GetFirstSound(word[i]);
       for(;Temp != "";)
       {
          s += Temp;
          Temp = GetNextMultiSound(word[i]);
       }
       if(s != "")
          s += "'";

     再把串截取出来
      

  8.   

    TO CDSoftwareWj(95927):能否将你的穷举算法列出来?
      

  9.   

    to kbsoft(景乐)   谢谢,取汉字拼音这块程序我以做出来了,只是要实现客户要求,要分别把一个词中所有汉字读音取出排列……词中多音字越多组合的就越多……  to zf925(天下哪来那么多高手)   也谢谢你的关注和帮忙,字符串我也组合出来了,就是怎么把它拆成我要的比如:   中国人:我以把拼音组和成  zhong@guo@ren
       和解(都是多音字):我以把拼音组和成 huo'hu'he@xie'jie
       
       我用'@' 分割字,用"'"分割多音   我的程序也以可以分析,两个字这种了……   但对于多个字………   比如: 和解人:   那我想要的就是把huo'hu'he@xie'jie@ren拆成huo'xie'ren
    huo'jie'ren
    hu'xie'ren
    hu'jie'ren
    he'xie'ren
    he'jie'ren
      

  10.   

    to   chinakiss8848(似乎明白了) 
      哈哈!! 看来只有你明白了,我也想了半天,也只能用递归了 :(我现在就在想这个递归结构……
      

  11.   

    CDSoftwareWj(95927) :
    请把你的递归结构列出来看看,好吗?
      

  12.   

     to kbsoft(景乐)  还没有做完 :) 不好意思  正在做
      如果做完了我会把全部代码列出来的
      

  13.   

    你的MAIL是多少?
    email: [email protected]
    QQ 7862483
    有空聊聊
      

  14.   

    先定拼音串的结构吧:
      strHZ := "和解人"
      strHZpy :array(1..length(strHZ)) of string =('3huo2hu1he0','2xie1jie0','1ren0');和: 3hou2hu1he 这样定的好处是,取第一个字符就可以知道一共有几个读音,
    而顺序区出以便排序可以这样:(当然,我是简单的写个伪代码)for i := strToint(strHZpy[1][1]) downto 1 do 
       py := copy(strHZpy[1], findstr(strHZpy[1],intTostr(i)),findstr(strHZpy[1],intTostr(i-1))-findstr(strHZpy[1],intTostr(i)));等一下,在想递归的算法!
      

  15.   


    我妹妹 : [email protected]
    MSN : [email protected]
      

  16.   

    HZPY :array[1..length(strHZ)] of string;function GT(strHZ, j{strHZ的第j个字}):string;
    begin
      if j<>Length(strHZ) then
      begin
        for i := strToint(strHZpy[j][1]) downto 1 do 
        begin      HZPY[j] := copy(strHZpy[j], findstr(strHZpy[1],intTostr(i))+1,findstr(strHZpy[1],intTostr(i-1))-findstr(strHZpy[1],intTostr(i)));     GT(strHZ, j-1);
        end
      else
        begin
          HZPY[j] := copy(strHZpy[j], findstr(strHZpy[1],intTostr(i))+1,findstr(strHZpy[1],intTostr(i-1))-findstr(strHZpy[1],intTostr(i)));
         print(HZPY); //打印汉字拼音串
        end;
      end;
    end;
      

  17.   

    下面是一个处理上述问题的通用递归算法:
    首先生成一标志字符串如:‘435’代表共有三重循环,第一重5次,二重3次,三重4次
    procedure Tform1.mysub(str:string);
    var i,count:integer;
    begin
    if length(str)=1 then
    begin
      count:=strtoint(str[length(str)]);
      for i:=1 to count do
      begin
      //////处理代码
      listbox1.Items.Add(inttostr(i));
      end;
      exit;
    end;//////递归处理
    count:=strtoint(str[1]);
    for i:=1 to count do
    begin
      listbox1.items.add(inttostr(i)+'////'+copy(str,2,length(str)-1)) ;
      mysub(copy(str,2,length(str)-1));
    end;
    ////递归结束
    end;
      

  18.   

    刚才给的程序是我随手写的伪代码,现在解释以下:findstr(strHZpy[j],intTostr(i)):找第j个汉字到第i个拼音串!不好意思,
    刚才所有的findstr(strHZpy[j],intTostr(i))
      写成了:findstr(strHZpy[1],intTostr(i))HZPY是放汉字串的当前读音排序的拼音
      

  19.   

    uses
      StrUtils;procedure p(mStr: string; mStrings: TStrings);
    var
      I: Integer;
      L: Integer;
      T: string;
    begin
      mStrings.Clear;
      L := Length(mStr);
      T := DupeString('0', L);
      while T <> mStr do begin
        mStrings.Add(T);
        for I := L downto 1 do begin
          if StrToIntDef(T[I], 0) >= StrToIntDef(mStr[I], 0) then
            T[I] := '0'
          else begin
            T[I] := Succ(T[I]);
            Break;
          end;
        end;
        if mStrings.Count > 100 then Exit;
      end;
      mStrings.Add(mStr);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      p('0120', Memo1.Lines)
    end;
      

  20.   

    老大 zSWANg(伴水)(* pascal→c *)!!!那里有StrUtils这个单元呀
      

  21.   

    每个字的所有不同读音可以用遍历的方法得到,剩下的便是得出它们的组合了。经典的算法在教材上应该可以找到;我有一个想法,请大家过目:基本思想:1.用[字数n] 和[Max(读音数)+1]初始化一个动态二维数组,该数组用来存放汉字串的读音,其中每一行存放一个字的各种不同读音,如:A为数组,A00表示第一个汉字的第一个读音,A12表示第二个汉字的第三个读音;另外将数组每一行的最后读音下一个元素置一标志用以标志该行的读音结束,如第二行有三个读音分别存发在元素A10、A11、A12中,则在元素A13中存放结束标志(所以列下标宽度为[Max(读音数)+1]);2.列出组合,只要将数组每行中结束标志前的元素的所有组合列出即可,方法是:
    从每行的第一个元素(列下标为0)开始,然后将最后一行的列标加 1,并判断元素值是否为结束标志,如果是则将列标置为0,并将前一行的列标加1,依次类推,只用一个循环,次数为各汉字读音数之积即总组合数;
    例如:
    第一个组合A10.. A(n-3)0 A(n-2)0 A(n-1)0  //n为字数
    第二个组合A10.. A(n-3)0 A(n-2)0 A(n-1)1
    第三个组合A10.. A(n-3)0 A(n-2)0 A(n-1)2  
    第四个组合A10.. A(n-3)0 A(n-2)1 A(n-1)0  //A(n-1)3的值为结束标志
    第四个组合A10.. A(n-3)0 A(n-2)1 A(n-1)1  
    第四个组合A10.. A(n-3)0 A(n-2)1 A(n-1)2  
    第四个组合A10.. A(n-3)1 A(n-2)0 A(n-1)0  //A(n-2)2的值为结束标志
    第四个组合A10.. A(n-3)1 A(n-2)0 A(n-1)1  
    第四个组合A10.. A(n-3)1 A(n-2)0 A(n-1)2希望已说明白,请建议,谢谢!  
      

  22.   

    //for Delphi6
    //如果你是Delphi5请加function DupeString(const AText: string; ACount: Integer): string;
    var
      P: PChar;
      C: Integer;
    begin
      C := Length(AText);
      SetLength(Result, C * ACount);
      P := Pointer(Result);
      if P = nil then Exit;
      while ACount > 0 do
      begin
        Move(Pointer(AText)^, P^, C);
        Inc(P, C);
        Dec(ACount);
      end;
    end;
      

  23.   

    //.......
      L := Length(mStr);
      T := StringReplace(Format('%*s', [L, '']), #32, '0', [rfReplaceAll]); //或者修改成
      while T <> mStr do begin
    //.......
      

  24.   

    //请你测试function StrLeft(const mStr: string; mDelimiter: string): string;
    { 返回左分隔字符串 }
    begin
      Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
    end; { StrLeft }function ListCount(mList: string; mDelimiter: string = ','): Integer;
    { 返回列表数 }
    var
      I, L: Integer;
    begin
      Result := 0;
      if mList = '' then Exit;
      L := Length(mList);
      I := Pos(mDelimiter, mList);
      while I > 0 do begin
        mList := Copy(mList, I + Length(mDelimiter), L);
        I := Pos(mDelimiter, mList);
        Inc(Result);
      end;
      Inc(Result);
    end; { ListCount }function ListValue(mList: string; mIndex: Integer; mDelimiter: string = ','): string;
    { 返回列表指定位置的元素 }
    var
      I, L, K: Integer;
    begin
      L := Length(mList);
      I := Pos(mDelimiter, mList);
      K := 0;
      Result := '';
      while (I > 0) and (K <> mIndex) do begin
        mList := Copy(mList, I + Length(mDelimiter), L);
        I := Pos(mDelimiter, mList);
        Inc(K);
      end;
      if K = mIndex then Result := StrLeft(mList + mDelimiter, mDelimiter);
    end; { ListValue }//---------------------------------------------
    procedure p(mStr: string; mStrings: TStrings);
    var
      I: Integer;
      L: Integer;
      T: string;
    begin
      mStrings.Clear;
      L := Length(mStr);
      T := StringReplace(Format('%*s', [L, '']), #32, '0', [rfReplaceAll]);
      while T <> mStr do begin
        mStrings.Add(T);
        for I := L downto 1 do begin
          if StrToIntDef(T[I], 0) >= StrToIntDef(mStr[I], 0) then
            T[I] := '0'
          else begin
            T[I] := Succ(T[I]);
            Break;
          end;
        end;
        if mStrings.Count > 100 then Exit;
      end;
      mStrings.Add(mStr);
    end;function f(mStr: string; mStrings: TStrings): Boolean;
    var
      vStringList1: TStringList;
      vStringList2: TStringList;
      I, J: Integer;
      S: string;
    begin
      Result := False;
      if not Assigned(mStrings) then Exit;
      mStrings.Clear;
      vStringList1 := TStringList.Create;
      vStringList2 := TStringList.Create;
      try
        S := '';
        vStringList1.Text := StringReplace(mStr, '@', #13#10, [rfReplaceAll]);
        for I := 0 to vStringList1.Count - 1 do
          S := S + IntToStr(ListCount(vStringList1[I], '''') - 1);
        p(S, vStringList2);
        for I := 0 to vStringList2.Count - 1 do begin
          S := '';
          for J := 0 to vStringList1.Count - 1 do
            S := S + '''' + ListValue(vStringList1[J],
              StrToIntDef(vStringList2[I][J + 1], 0), '''');
          Delete(S, 1, 1);
          mStrings.Add(S);
        end;
      finally
        vStringList1.Free;
        vStringList2.Free;
      end;
      Result := True;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      f('huo''hu''he@xie''jie@ren', Memo1.Lines);
    end;
      

  25.   

    完整正确的程序我给你写好了:const
      max = 10;
    var
      Form1: TForm1;
      HZPY :array[1..max] of string;
      strHZpy :array[1..max] of string;implementation{$R *.DFM}procedure GT( j :integer);
    var
      i,m :integer;
      s :string;
    begin  if j<>3 then
        for i := strToint(strHZpy[j][1]) downto 1 do
        begin
          HZPY[j] := copy(strHZpy[j]
                          ,Pos(intTostr(i),strHZpy[j])+1
                          ,Pos(intTostr(i-1),strHZpy[j])-
                          Pos(intTostr(i),strHZpy[j]) -1 );
          GT(j+1);
        end
      else
        for i := strToint(strHZpy[j][1]) downto 1 do
            begin
              HZPY[j] := copy(strHZpy[j]
                              ,Pos(intTostr(i),strHZpy[j])+1
                              ,Pos(intTostr(i-1),strHZpy[j])-
                               Pos(intTostr(i),strHZpy[j]) -1 );
               //打印汉字拼音串
              s:='';
              for m:=1 to 3 do
                s:=s+HZPY[m]+' ';
              Form1.RichEdit1.Lines.Add( s );
            end;end;procedure TForm1.Button1Click(Sender: TObject);
    var
      HZ :string;
    begin
      HZ := '和解人';
      strHZpy[1]:='3hou2he1hu0';
      strHZpy[2]:='2jie1xie0';
      strHZpy[3]:='1ren0';
      GT(1);
    end;end.
      

  26.   

    下面的两个3是你汉字的个数:if j<>3 then
      for i := strToint(strHZpy[j][1]) downto 1 do
      
    for m:=1 to 3 do
        s:=s+HZPY[m]+' ';这个递归算法很容易理解~~
      

  27.   

    to  zSWANg(伴水)(* pascal→c *)   高手高手!!! p~~f~~~~p~~f~
      

  28.   

    if mStrings.Count > 100 then Exit; //这句话请删除掉!
      

  29.   

    const
      max = 10;
    var
      Form1: TForm1;
      HZPY :array[1..max] of string;   //放当前的汉字拼音(GT中用)
      strHZpy :array[1..max] of string;//每个汉字所有的读音
      iHZtotal :integer;  //汉字的个数implementation{$R *.DFM}procedure GT( j :integer); //递归程序
    var
      i,m :integer;
      s :string;  //用于输出
    begin  if j<>iHZtotal then //是否为最后一个汉字?
      
        for i := strToint(strHZpy[j][1]) downto 1 do
        begin
          HZPY[j] := copy(strHZpy[j]     //取第j个汉字的第i种读音
                          ,Pos(intTostr(i),strHZpy[j])+1
                          ,Pos(intTostr(i-1),strHZpy[j])-
                           Pos(intTostr(i),strHZpy[j]) -1 );
          GT(j+1); //递归调用
        end  else //是最后一个汉字就可以打印    for i := strToint(strHZpy[j][1]) downto 1 do
            begin
              HZPY[j] := copy(strHZpy[j] //取最后一个汉字的第i种读音
                              ,Pos(intTostr(i),strHZpy[j])+1
                              ,Pos(intTostr(i-1),strHZpy[j])-
                               Pos(intTostr(i),strHZpy[j]) -1 );           //打印汉字拼音串
              s:='';
              for m:=1 to iHZtotal do
                s:=s+HZPY[m]+' ';
              Form1.RichEdit1.Lines.Add( s );
            end;end;procedure TForm1.Button1Click(Sender: TObject);
    var
      HZ :string;
    begin
      HZ := '和解人';
      strHZpy[1]:='3hou2he1hu0';
      strHZpy[2]:='2jie1xie0';
      strHZpy[3]:='1ren0';
      iHZtotal := Length(HZ) div 2;
      RichEdit1.Lines.Add(HZ);
      GT(1);
    end;end.
      

  30.   

    ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
    有那么复杂吗???????????????
    #######################################################const
      max = 10;
    var
      Form1: TForm1;
      HZPY :array[1..max] of string;   //放当前的汉字拼音(GT中用)
      strHZpy :array[1..max] of string;//每个汉字所有的读音
      iHZtotal :integer;  //汉字的个数implementation{$R *.DFM}procedure GT( j :integer); //递归程序
    var
      i,m :integer;
      s :string;  //用于输出
    begin  if j<>iHZtotal then //是否为最后一个汉字?
      
        for i := strToint(strHZpy[j][1]) downto 1 do
        begin
          HZPY[j] := copy(strHZpy[j]     //取第j个汉字的第i种读音
                          ,Pos(intTostr(i),strHZpy[j])+1
                          ,Pos(intTostr(i-1),strHZpy[j])-
                           Pos(intTostr(i),strHZpy[j]) -1 );
          GT(j+1); //递归调用
        end  else //是最后一个汉字就可以打印    for i := strToint(strHZpy[j][1]) downto 1 do
            begin
              HZPY[j] := copy(strHZpy[j] //取最后一个汉字的第i种读音
                              ,Pos(intTostr(i),strHZpy[j])+1
                              ,Pos(intTostr(i-1),strHZpy[j])-
                               Pos(intTostr(i),strHZpy[j]) -1 );           //打印汉字拼音串
              s:='';
              for m:=1 to iHZtotal do
                s:=s+HZPY[m]+' ';
              Form1.RichEdit1.Lines.Add( s );
            end;end;procedure TForm1.Button1Click(Sender: TObject);
    var
      HZ :string;
    begin
      HZ := '和解人';
      strHZpy[1]:='3hou2he1hu0';
      strHZpy[2]:='2jie1xie0';
      strHZpy[3]:='1ren0';
      iHZtotal := Length(HZ) div 2;
      RichEdit1.Lines.Add(HZ);
      GT(1);
    end;end.