1.利用二维数组构造莫尔斯码到字母数字标点的双射,其中二维数组下标与莫尔斯码也是一种双射,于是形成了“字符串<->数组序号<->字母、数字”的双射
2.char数组设为全局变量时,里面所有的字符全部默认初始化为'\0',如果不覆盖掉,printf输出字符数组时会输出到'\0'为止
3.ans数组要么手动添加'\0',要么memset一下
代码如下:
#include <bits/stdc++.h> using namespace std; //3061:二维数组构造字符串到字母数字的双射 //字符串<->数组序号<->字母、数字 char mapping[][10]={".-","-...","-.-.","-..", ".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----","..---","...--","....-",".....","-....","--...","---..","----.","/","///","/////"}; char str[2000]; char save[300][10]; char ans[2000]; int T, cnt; char conver(int x) { if(x<26) return x+'A'; else if(x<36) return x-26+'0'; else if(x==37) return ' '; else if(x==38) return '.'; } int main() { cin>>T; char ch=getchar(); while(T--){ gets(str); int len=strlen(str); int j=0, k=0, l; for(int i=0;i<len;++i){ if(str[i]!='/') save[j][k++]=str[i]; else{ save[j][k]='\0'; j++, k=0; l=i; save[j][k++]=str[l]; l++; while(str[l]=='/'){ save[j][k++]=str[l]; l++; } //处理边界情况 save[j][k]='\0'; j++, k=0; i=l; if(i<len) save[j][k++]=str[i]; else break; } } save[j][k++]='\0'; j++, k=0; int wordNum=j; int m=0;//记录ans数组的值,覆盖\0字符,否则printf读到\0结束 for(int i=0;i<wordNum;++i) for(int j=0;j<39;++j) if(strcmp(save[i],mapping[j])==0&&strcmp(save[i],mapping[36])!=0) ans[m++]=conver(j); ans[m]='\0';//或者重新初始化ans数组 printf("case #%d:\n",cnt++); printf("%s\n",ans); } return 0; } /* 3 .../---/... -/..../../...///../...///--/---/.-./..././//-.-./---/-.././////-.../-.--/. -./---///.----/..---/----- */