开始好好写解题报告的代码注释了呜呜。
题目概述:
把中心翻译过来:要给奶牛命名,一个奶牛有好几种可能的名字,找到在字典中出现过的奶牛的名字。
字典包含5000以下的字符串,每个字符串小于20字母。
算法思想:
其实可以自然而然有两种想法,第一种是读入一个数,然后计算出其所有可能出现的组合。比如题中的4734所对应的各种奇怪字母字符串。然后对于每一个字符串,都去字典里面扫一遍。
第二种做法的话是先把字典翻译过来,然后字典遍历一遍对应,看相同的字符的话就开始输出。
嗯其实显然是第二种更快呀。
所以思想就在这里了,代码的具体实现如下。
这次的代码开始有注释了哟。
代码部分:
#include <iostream> #include <fstream> #include <string> using namespace std; ifstream fin("namenum.in"); ofstream fout("namenum.out"); ifstream in("dict.txt"); int k; // C++ 有string这种东西,就让我抛弃了char[]了,这里string数组存了txt中的所有input string s[5000]; // map 这个数组做了一个字典序,就是将字母转化为数字 int map[26] = { 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 0, 7, 7, 8, 8, 8, 9, 9, 9, 0 }; int main() { string num; bool flag = 0; k = 0; // 将txt中所有input存进s[],同时记录一共有多少个string while (in >> s[k]) { k++; } fin >> num; for (int i = 0; i < k; i++) { // 大Flag是判断当前word是不是,小flag记得是有没有合适的输出。 int Flag = 1; // 下句是剪枝,如果size不相符的话直接就退出 if (num.size() != s[i].size()) continue; for (int j = 0; j < s[i].size(); j++) { // ASCII码的操作 if (map[s[i][j] - 'A'] != num[j] - '0') { Flag = 0; break; } } if (Flag) { flag = 1; fout << s[i] << endl; } } if (!flag) { fout << "NONE" << endl; } return 0; }