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

ZOJ 1068 摩斯密码

2012年11月09日 ⁄ 综合 ⁄ 共 3172字 ⁄ 字号 评论关闭

///////////////////////////////////////////////////////
//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;
}

抱歉!评论已关闭.