【阿杰程序4】Morse密码翻译
原题目名字:P,MTHBGWB
题目给人都看傻了,网上搜题解的时候看见了这个神码。
可惜题解是图片形式,搜不到而且很冷门,
但是结构体用的真的是很精妙。
当时印象非常深刻,想着就算没学过结构体也要硬着头皮仿一个。
比较神奇的是出了一个bug:
网页复制字母对应morse码,鼠标拖长过了代码框,结果把代码框外面的制表符复制来了(复制来的制表符在vs里不显示!这意味着干看是没有bug的!只能通过运行模拟过程debug)。
因为这个卡了两天,最后硬是输出过程中代码转换的部分,发现多处一堆空格(黑人问号),最后锁定了一个字母的代码有错,但神的是对着代码表查不出错误(制表符不显示,永远看不出bug,我早就怀疑代码表可能有错,两天时间我检查了一万遍,和题解对了一万遍),我就把那个字母代码手打了一遍结果过了!?
怀着狐疑把代码cv到百度搜索框才发现了这个看不出来的bug,当时真的又气又笑。
从此debug能力大大提升。
//Sample Input
//5
//AKADTOF_IBOETATUK_IJN
//PUEL
//QEWOISE.EIVCAEFNRXTBELYTGD.
//?EJHUT.TSMYGW?EJHOT
//DSU.XFNCJEVE.OE_UJDXNO_YHU?VIDWDHPDJIKXZT?E
//Sample Output
//1: ACM_GREATER_NY_REGION
//2: PERL
//3: QUOTH_THE_RAVEN,_NEVERMORE.
//4: TO_BE_OR_NOT_TO_BE?
//5: THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG
#include<iostream>
#include<string>
using namespace std;
struct type
{
string str;
char c;
int length;
};
type letter[30]={{".-",'A',2},{"-...",'B',4},{"-.-.",'C',4},{"-..",'D',3},{".",'E',1},{"..-.",'F',4},
{"--.",'G',3},{"....",'H',4},{"..",'I',2},{".---",'J',4},{"-.-",'K',3},{".-..",'L',4},{"--",'M',2},
{"-.",'N',2},{"---",'O',3},{".--.",'P',4},{"--.-",'Q',4},{".-.",'R',3},{"...",'S',3},{"-",'T',1},
{"..-",'U',3},{"...-",'V',4},{".--",'W',3},{"-..-",'X',4},{"-.--",'Y',4},{"--..",'Z',4},
{"..--",'_',4},{".-.-",',',4},{"---.",'.',4},{"----",'?',4}};
int main()
{
int n,count=0,num[100];
cin>>n;
while(n--) //n行代码。
{
string mima,code,new_code;
cin>>code; //输入代码code。
for(unsigned i=0;i<code.length();i++) //代码转换,大写字母--i。
{
for(int k=0;k<30;k++) //寻找字母对应代码。
{
if(code[i]==letter[k].c)
{
mima+=letter[k].str; //代码累加。
num[i]=letter[k].length; //记录数字,数字--i。
break;
}
}
}
int position=0;
for(int i=code.length()-1;i>=0;i--) //执行i次,转换代码。
{
for(int k=0;k<30;k++)
{
if(mima.substr(position,num[i]).compare(letter[k].str)==0)
{
position+=num[i];
new_code+=letter[k].c;
break;
}
}
}
cout<<++count<<':'<<' '<<new_code;
if(n)
cout<<endl;
}
return 0;
}