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

xiaoxiao2021-02-28  56

题目链接 题目大意: 先输入字符,和其对应的密码,直到“”结束,你可知判断结束的标志是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; }
转载请注明原文地址: https://www.6miu.com/read-81709.html

最新回复(0)