现在的位置: 首页 > 综合 > 正文

USACO 1.2 Problem 3 Name That Number

2017年11月20日 ⁄ 综合 ⁄ 共 980字 ⁄ 字号 评论关闭

开始好好写解题报告的代码注释了呜呜。

题目概述:

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

字典包含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;
}

抱歉!评论已关闭.