您的位置:首页 > 其它

USACO 1.2 Problem 3 Name That Number

2014-12-30 02:51 357 查看
开始好好写解题报告的代码注释了呜呜。

题目概述:

把中心翻译过来:要给奶牛命名,一个奶牛有好几种可能的名字,找到在字典中出现过的奶牛的名字。

字典包含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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: