ZOJ 1068 摩斯密碼

來源:互聯網
上載者:User

///////////////////////////////////////////////////////
//1068摩斯密碼
//直接類比
#include<iostream>
#include<algorithm>
using namespace std;

 

char code[35][2][5];                  //記錄29個摩斯密碼
char str[150];                        //記錄輸入的原碼
char change[450];                     //記錄摩斯碼
int numlen[105];                      //記錄原碼每個字元的摩斯碼長度
int stringlen;                        //儲存原碼長度
int codelen;                          //儲存摩斯碼長度

void build()
{
    strcpy(code[0][0],".-");
    strcpy(code[1][0],"-...");
    strcpy(code[2][0],"-.-.");
    strcpy(code[3][0],"-..");
    strcpy(code[4][0],".");
    strcpy(code[5][0],"..-.");
    strcpy(code[6][0],"--.");
    strcpy(code[7][0],"....");
    strcpy(code[8][0],"..");
    strcpy(code[9][0],".---");
    strcpy(code[10][0],"-.-");
    strcpy(code[11][0],".-..");
    strcpy(code[12][0],"--");
    strcpy(code[13][0],"-.");
    strcpy(code[14][0],"---");
    strcpy(code[15][0],".--.");
    strcpy(code[16][0],"--.-");
    strcpy(code[17][0],".-.");
    strcpy(code[18][0],"...");
    strcpy(code[19][0],"-");
    strcpy(code[20][0],"..-");
    strcpy(code[21][0],"...-");
    strcpy(code[22][0],".--");
    strcpy(code[23][0],"-..-");
    strcpy(code[24][0],"-.--");
    strcpy(code[25][0],"--..");
    strcpy(code[26][0],"..--");         //底線“_”
    strcpy(code[27][0],"---.");         //句號  “.”
    strcpy(code[28][0],".-.-");         //逗號  “,”
    strcpy(code[29][0],"----");         //問號  “?”

    int i;
    for(i=0;i<30;i++)
    {
        code[i][1][0]=strlen(code[i][0])+'0';
        code[i][1][1]='\0';
    }
}

//使原碼化為摩斯碼,且記錄原碼每個字元的摩斯碼長度
void Input()
{
    cin>>str;
    stringlen=strlen(str);
    int i,j,k;
    int pos=0;
    k=0;
    for(i=0;i<stringlen;i++)
    {
        if(str[i]=='_')
            pos=26;
        else if(str[i]=='.')
            pos=27;
        else if(str[i]==',')
            pos=28;
        else if(str[i]=='?')
            pos=29;
        else
            pos=str[i]-'A';
        numlen[i]=code[pos][1][0]-'0';
        for(j=0;j<numlen[i];j++)
            change[k++]=code[pos][0][j];
    }
    codelen=k;
}

//對摩斯碼進行解碼
void Output()
{
    int i,j,k,m;
    bool flags;
    int pos,codestate;
    //m記錄摩斯碼串的字元下標
    m=0;                                   
    //對每一個編碼進行解碼
    for(i=0;i<stringlen;i++)
    {
        //flags為1時找到了該對應的字元
        flags=0;                
        pos=0;
        codestate=m;
        //對每個碼進行比較,看該摩斯碼是對應哪個字元
        for(j=0;j<30;j++)
        {
            //每次比較前,要使字元下標回到當前需要比較的摩斯碼首位置
            m=codestate;
            if(numlen[i]==code[j][1][0]-'0')
            {
                flags=1;
                for(k=0;k<code[j][1][0]-'0';k++)
                {
                    if(change[m++]!=code[j][0][k])
                    {
                        flags=0;
                        break;
                    }
                }
            }
            if(flags==1)
            {
                pos=j;
                break;
            }

        }
        if(pos==26)
            cout<<"_";
        else if(pos==27)
            cout<<".";
        else if(pos==28)
            cout<<",";
        else if(pos==29)
            cout<<"?";
        else
        {
            //這樣才可以輸出
            char s='A'+pos;
            cout<<s;
        }
    }
}

 

int main()
{
    build();
    int n;
    int casenum=1;
    cin>>n;
    while(n--)
    {
        Input();
        int i;
        //倒轉numlen裡的長度序
        for(i=0;i<stringlen/2;i++)
            swap(numlen[i],numlen[stringlen-1-i]);
        cout<<casenum<<": ";
        casenum++;
        Output();
        cout<<endl;
    }
    return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.