UVA 508 莫尔斯电码,map的妙用,函数的组合

题目链接
题目大意: 先输入字符,和其对应的密码,直到“”结束,你可知判断结束的标志是string类型的”“,而不是char类型的‘*’,心都碎了,然后输入许多单词,这相当于一个字典库,然后再输入许多密码串,然后在字典库中找相应的单词。
解题思路:答题的思路不难理解:先把单词和密码意义对应起来,给每一个单词都加密一下,存起来,map的用处,在匹配的过程中,不完全匹配的要注意一下,需要加或者减“末尾!!!”的一些东西,看见大神的做法很巧妙,就给copy学来了。substr()的用法。
注意:在做题时遇见了几个坑点,
1.“” 和‘
2.map的键都是单一的,一开始我把密码当作键,老是不对,flag不是1就是0,找了好久才找到这个隐藏的坑。
3.一开始我把minn当作全局变量,自己测试完全没问题啊,一交就WA,对比大神的代码,才找到,老一会才反应过来,因为不同的字符串,要加或者减的大小也不一样,上一个字符串减去了1,这一个字符串拼了老命也做不到,结果人家minn还不变化,这问题不就来了!!!!
4。最后,坑都是自己挖的,且挖且珍惜啊,成长的宝藏啊

7月28日补充:今天又做了一遍还是没做出来,总结一下原因,一个是关于substr函数的运用根本就没有掌握,还有一点便是,总觉得自己以前做过,凭着自己的印象跑偏了题,题目中要求的是最后加上或者剪掉几个电码,我理解成了加上或者减掉几个字母…
还有便是关于substr()函数,他是string类里面的函数,用法是
s.substr(n, m)截取s字符串中的n~m部分将其组成一个新的字符串作为返回值。
再有便是两个字符串长度相减取绝对值要用labs()用abs()如果括号里里面是负数就会出错
具体原因:s1.size()的返回类型是size_t也就是unsinged int类型,如果两数相减结果为负数的话,就会超过int范围用abs()显然会错,如果用labs()他会自动转成long long类型也就是-1,然后得到结果1,一个帮助理解数据的小程序:

#include<string>
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;

int main()
{
    string s1, s2;
    unsigned int a1, a2;
    long long x;
    while(cin >> s1 >> s2)
    {
    cin >> x;
    cout << (unsigned int)x << endl;
    cin >> a1 >> a2;
    cout << a1 - a2 << endl;
    cout << (s2.size() - s1.size()) << endl;
    cout << labs(int(s2.size()) - int(s1.size())) << endl;
    }
}
#include<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;

int flag;
map<string ,string> Words; // 把单词储存起来,到时候直接查单词就行了;
map<char, string> Mos; // 把字母对应的单词存起来;
map<char, string> :: iterator iter1;
map<string, string>:: iterator iter2;

void encode(string s) // 把单词都转换成莫尔斯码的形式
{
    int len = s.size();
    string ss = "";
    for(int i = 0; i < len; i++)
    {
        iter1 = Mos.find(s[i]);
        ss += iter1 -> second;
    }
    Words.insert(make_pair(s, ss)); // 键为码, 值为单词
}

string made(string s)  // 匹配莫尔斯码和单词
{
    flag = 0;
    string ss;

            for(iter2 = Words.begin(); iter2 != Words.end(); iter2++){
            if(iter2 -> second == s){
                if(flag == 0)
                    ss = iter2 -> first;
                flag++;
            }
        }
    if(flag == 0)
    {
        int minn = 2147483647;
        for(iter2 = Words.begin(); iter2 != Words.end(); iter2++)
        {
            if(s == iter2->second.substr(0,s.size()) || iter2->second == s.substr(0, iter2->second.size()))
            {
                if(labs(s.size() - iter2->second.size()) < minn)
                {
                    minn = labs(s.size() - iter2->second.size());
                    ss = iter2 -> first;
                }
            }
        }
    }
    return ss;
}

int main()
{
    //char ch;
    string keng;
    string str, s;
    while(cin >> keng && keng != "*")
    {
        cin >> str;
        Mos.insert(make_pair(keng[0], str));
    }
    while(cin >> str && str != "*")
    {
        encode(str);
    }
    while(cin >> str && str != "*")
    {
       s = made(str);
      if(flag == 1) cout << s ;
      else if(flag == 0) cout << s << "?" ;
      else if(flag > 1) cout << s << "!" ;
     cout << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
莫尔斯电码是一种常用的电报编码,可以将字母、数字、标点符号等转换为一系列点和横线的组合。如果想要使用Matlab实现莫尔斯电码加密,可以按照以下步骤进行: 1. 定义莫尔斯电码字母表:莫尔斯电码字母表是由点和横线组成的字符编码序列,每个字母、数字、标点符号都有对应的莫尔斯电码。可以在Matlab中定义一个莫尔斯电码字母表的结构体,每个字母、数字、标点符号对应一个字段,字段的值为该字符的莫尔斯电码。 ``` morseCode.alphabets.A = '.-'; morseCode.alphabets.B = '-...'; morseCode.alphabets.C = '-.-.'; morseCode.alphabets.D = '-..'; morseCode.alphabets.E = '.'; morseCode.alphabets.F = '..-.'; morseCode.alphabets.G = '--.'; morseCode.alphabets.H = '....'; morseCode.alphabets.I = '..'; morseCode.alphabets.J = '.---'; morseCode.alphabets.K = '-.-'; morseCode.alphabets.L = '.-..'; morseCode.alphabets.M = '--'; morseCode.alphabets.N = '-.'; morseCode.alphabets.O = '---'; morseCode.alphabets.P = '.--.'; morseCode.alphabets.Q = '--.-'; morseCode.alphabets.R = '.-.'; morseCode.alphabets.S = '...'; morseCode.alphabets.T = '-'; morseCode.alphabets.U = '..-'; morseCode.alphabets.V = '...-'; morseCode.alphabets.W = '.--'; morseCode.alphabets.X = '-..-'; morseCode.alphabets.Y = '-.--'; morseCode.alphabets.Z = '--..'; morseCode.alphabets.zero = '-----'; morseCode.alphabets.one = '.----'; morseCode.alphabets.two = '..---'; morseCode.alphabets.three = '...--'; morseCode.alphabets.four = '....-'; morseCode.alphabets.five = '.....'; morseCode.alphabets.six = '-....'; morseCode.alphabets.seven = '--...'; morseCode.alphabets.eight = '---..'; morseCode.alphabets.nine = '----.'; morseCode.alphabets.period = '.-.-.-'; morseCode.alphabets.comma = '--..--'; morseCode.alphabets.question = '..--..'; morseCode.alphabets.apostrophe = '.----.'; morseCode.alphabets.exclamation = '-.-.--'; ``` 2. 编写加密函数:加密函数的输入为需要加密的文本,输出为莫尔斯电码序列。可以按照以下思路编写加密函数: - 将需要加密的文本全部转换为大写字母,方便后续处理 - 对于每个字符,查找莫尔斯电码字母表中对应的莫尔斯电码,将莫尔斯电码序列拼接到一起,每个字符之间用空格隔开 ``` function [morseCodeSequence] = encryptMorseCode(text) % Convert all letters to uppercase text = upper(text); % Get the morse code dictionary morseCode = getMorseCodeDictionary(); % Initialize the morse code sequence morseCodeSequence = ''; % Iterate through each character in the text for i=1:length(text) % Get the morse code for the current character if isfield(morseCode.alphabets, text(i)) morseCodeSequence = [morseCodeSequence, morseCode.alphabets.(text(i)), ' ']; elseif text(i)==' ' morseCodeSequence = [morseCodeSequence, '/ ']; end end end ``` 3. 测试加密函数:可以编写一个简单的测试脚本来测试加密函数,例如: ``` text = 'Hello World!'; morseCodeSequence = encryptMorseCode(text); disp(morseCodeSequence); ``` 输出结果为: ``` .... . .-.. .-.. --- / .-- --- .-. .-.. -.. -.-.-- ``` 这就是将原始文本加密后的莫尔斯电码序列。 需要注意的是,莫尔斯电码加密只是一种简单的加密方式,容易被破解。如果需要更加安全的加密方式,可以考虑使用其他加密算法,如AES、RSA等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值