莫尔斯码 |
Time Limit: 1 Seconds Memory Limit: 32768 K Total Submit:38 Accepted:13 |
Description 莫尔斯码采用'.'和'-'代表字符 Input 多组测试数据,每组一行。 Output 对于每组数据,输出解码后的字符。 Sample Input
.-3&-... . -.-.&^*^
Sample Output
AB EC
Source PhoenixWright@fjnu |
#include <iostream>
using namespace std;
struct tree
{
char value;
tree* left;
tree* right;
};
tree ts[38];
tree head;
void createtree(tree* t, char m[], int index, char value)
{
if (m[index] == '/0')
{
t->value = value;
return;
}
if (m[index] == '.')
{
if (t->left == NULL)
{
t->left = new tree;
t->left->left = NULL;
t->left->right = NULL;
}
createtree(t->left, m, index+1,value);
}
else
{
if (t->right == NULL)
{
t->right =new tree;
t->right->right = NULL;
t->right->left = NULL;
}
createtree(t->right, m, index+1, value);
}
}
void init()
{
head.left = new tree;
head.right = new tree;
head.left->left = NULL;
head.left->right = NULL;
head.right->left=NULL;
head.right->right=NULL;
char mksm[26][6]={
".-" , //A
"-..." , //B
"-.-." , //C
"-.." , //D
"." , //E
"..-." , //F
"--." , //G
"....", //H
".." , //I
".---" , //J
"-.-" , //K
".-.." , //L
"--" , //M
"-." , //N
".--." , //O
".--." , //P
"--.-" , //Q
".-." , //R
"..." , //S
"-" , //T
"..-" , //U
"..-" , //V
".--" , //W
"-..-" , //X
"-.--" , //Y
"--.." //Z
};
for (int i=0; i<26; i++)
{
if (mksm[i][0] == '.')
{
createtree(head.left,mksm[i],1,i+65);
}
else
{
createtree(head.right,mksm[i],1,i+65);
}
}
char mksm1[10][6]=
{
"-----", //0
".----", //1
"..---", //2
"...--", //3
"....-", //4
".....", //5
"-....", //6
"--...", //7
"---..", //8
"----.", //9
};
for (int i=0; i<10; i++)
{
if (mksm1[i][0] == '.')
{
createtree(head.left,mksm1[i],1,i+48);
}
else
{
createtree(head.right,mksm1[i],1,i+48);
}
}
createtree(head.left,"..--..",1,63); //?
createtree(head.left,".-.-.-",1,46); //.
}
char answer[100];
int index1=0;
void getanswer(tree* t, char data[],int start, int end)
{
if (start == end)
{
answer[index1++] = t->value;
}
else
{
if (data[start] == '.')
{
getanswer(t->left, data,start+1,end);
}
else
{
getanswer(t->right, data,start+1,end);
}
}
}
void release(tree* t)
{
if (t != NULL)
{
release(t->left);
release(t->right);
delete t;
}
}
int main()
{
char testdata[100];
int lenth=0;
int index=0;
int size=0;
init();
//cin>>testdata;
cin.getline(testdata,100);
lenth = strlen(testdata);
for (int i=0; i<=lenth; i++)
{
switch(testdata[i])
{
case '.':
case '-': size++; break;
default:
{
if(size != 0)
getanswer(&head,testdata,i-size,i);
size = 0;
break;
}
}
}
answer[index1] = '/0';
cout<<answer;
cin.get();
release(head.left);
release(head.right);
return 0;
}