您的位置:首页 > 其它

ZOJ 1068 摩斯密码

2010-05-11 10:09 197 查看
///////////////////////////////////////////////////////
//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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: